<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[FMI Cyber Security Consulting Services - Medium]]></title>
        <description><![CDATA[FMI Cyber Security Consulting Services is a division under PT. FPT Metrodata Indonesia and part of Metrodata Group. FMI Cyber Security Consulting Services provide following services : VAPT, Red Teaming, DFIR Services, MSS SOC, Training, and other cyber security fields. - Medium]]></description>
        <link>https://medium.com/fmisec?source=rss----5aebc5961dd0---4</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>FMI Cyber Security Consulting Services - Medium</title>
            <link>https://medium.com/fmisec?source=rss----5aebc5961dd0---4</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 11 Oct 2026 03:57:13 GMT</lastBuildDate>
        <atom:link href="https://medium.com/feed/fmisec" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Hunting on the Wire : A Practical Guide to Network Threat Hunting — Part 1]]></title>
            <link>https://medium.com/fmisec/hunting-on-the-wire-a-practical-guide-to-network-threat-hunting-part-1-be41c6dfeb77?source=rss----5aebc5961dd0---4</link>
            <guid isPermaLink="false">https://medium.com/p/be41c6dfeb77</guid>
            <category><![CDATA[threat-hunting]]></category>
            <category><![CDATA[network-forensics]]></category>
            <category><![CDATA[network-threat-hunting]]></category>
            <category><![CDATA[blue-team]]></category>
            <category><![CDATA[research]]></category>
            <dc:creator><![CDATA[Digit Oktavianto]]></dc:creator>
            <pubDate>Thu, 08 Oct 2026 02:01:03 GMT</pubDate>
            <atom:updated>2026-10-08T02:01:03.596Z</atom:updated>
            <content:encoded><![CDATA[<h3>Network Threat Hunting, Part 1: You Can Hide Processes, But You Can’t Hide Packets</h3><p><em>Why the network is the threat hunter’s ground truth — and how to think about hunting before you touch a single log.</em></p><p><em>This is Part 1 of a three-part series for SOC analysts, threat hunters and DFIR practitioners. Part 1 covers the why and the mindset. Part 2 goes deep on the technical hunts (long connections, lateral movement, beacons, DNS, protocol anomalies, outliers). Part 3 is hands-on: lab setup, tooling, datasets and exercises.</em></p><p>Every incident responder has lived this moment. The EDR console is green. The SIEM has no high-severity alerts. Then a third party calls: your data is on a leak site, or one of your IPs is talking to known infrastructure.</p><p>The numbers say this is still common. Mandiant’s <a href="https://cloud.google.com/blog/topics/threat-intelligence/m-trends-2026">M-Trends 2026</a> reports a global median dwell time of <strong>14 days</strong>, up from 11 days the year before. For cyber-espionage intrusions the median was <strong>122 days</strong>. One espionage campaign (BRICKSTORM) persisted for nearly <strong>400 days</strong> on network appliances — devices that typically run no EDR agent at all. And <strong>48%</strong> of intrusions were still first detected by someone outside the victim organization.</p><p>That gap — between “nothing is alerting” and “we are compromised” — is exactly where threat hunting lives. And in my experience, the network is the best place to start looking.</p><h3>What threat hunting is (and what it isn’t)</h3><p>Threat hunting is the proactive, human-led search for adversary activity that your existing controls did not detect. The key word is <em>proactive</em>: you are not waiting for an alert. You start from the assumption that something may already be inside and go looking for evidence that proves or disproves it.</p><p>Active Countermeasures (ACM), the team behind RITA and AC-Hunter, frames it even more sharply in their <a href="https://www.activecountermeasures.com/wp-content/uploads/2021/02/Network-Threat-Hunting-202102.pdf">Network Threat Hunting training</a>: a hunt is a <strong>proactive validation of every system connected to the network</strong>, executed without assumptions, which produces a <strong>compromise assessment for each device</strong>. In other words, the output of a good hunt is not “we found nothing”. It is “we checked these hosts against these behaviours, and here is the disposition of each one.”</p><p>It helps to separate hunting from its neighbours:</p><ul><li><strong>Detection engineering / SOC monitoring</strong> is reactive and automated. A rule fires, an analyst triages. It only catches what someone already wrote a rule for.</li><li><strong>Incident response</strong> starts once you <em>know</em> there is an incident. Scope is defined by the alert or the report.</li><li><strong>Threat hunting</strong> starts with a question, not an alert. Its outputs feed both of the above: confirmed findings go to IR; repeatable patterns become new detections.</li></ul><p>If your “hunting” is re-running yesterday’s SIEM queries and closing the tickets, you are doing monitoring. That is valuable, but it is not hunting.</p><h3>Why start on the network?</h3><p><strong>ActiveCounterMeasures (ACM)</strong> training uses a line that has stuck with me for years: <strong>“you can hide processes, but you can’t hide packets.”</strong></p><p>On the endpoint the attacker is on home turf. They can unhook EDR, kill or blind agents with vulnerable drivers, clear event logs, run in memory, or simply live on a device that never had an agent — a VPN concentrator, a firewall, a printer, an OT controller, a hypervisor. Logs on a compromised host are evidence <em>the attacker controls</em>.</p><p>The network is different. For an intrusion to be useful, the attacker needs to talk to it:</p><ul><li>They need a <strong>command-and-control (C2) channel</strong> to send instructions and receive results.</li><li>They need to <strong>move laterally</strong> to reach the data or the domain controller or to any crown jewel assets.</li><li>They usually need to <strong>move data out for performing data exfiltration.</strong></li></ul><p>Each of those leaves traffic. A sensor placed off-host, on a SPAN port or TAP, records that traffic independently of the compromised endpoint. The attacker can encrypt the content, but they cannot easily hide <em>that</em> a connection happened, how long it lasted, how often it repeated, how many bytes moved, or which domain was resolved first.</p><p>This is also why ACM argues against starting a hunt from raw syslog. Syslog was never designed as a security data source, message formats vary by vendor, and much log review collapses into signature matching — what they call the “1990s anti-virus model”. Network metadata, by contrast, is uniform: every connection has a source, a destination, a port, a protocol, a duration and a byte count, no matter which OS or app produced it.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*cNOHsbKzy_ErxkUB0ki__w.png" /><figcaption>Network Threat Hunting</figcaption></figure><h3>The C2 lens: focus on persistence first</h3><p>The most practical idea in ACM’s <a href="https://www.activecountermeasures.com/how-to-threat-hunt-your-network/">How to Threat Hunt Your Network</a> is ordering your work by threat. Instead of trying to look at everything, start with the evidence that most strongly indicates compromise: <strong>persistent outbound communication</strong>.</p><p>An implant has two ways to stay in touch with its operator:</p><ol><li><strong>Long connections</strong> — keep one session open for hours or days and push commands down it.</li><li><strong>Beacons</strong> — open short sessions on a schedule, just long enough to check in (“any tasks for me?”), then disconnect.</li></ol><p>Either way, the pattern is <em>persistent</em>, and persistence is something you can measure from connection metadata alone. ACM’s five-step method builds on that:</p><ol><li>Identify persistent communication channels leaving the network.</li><li>Analyse the protocol being used.</li><li>Evaluate the internal host originating the traffic.</li><li>Check the reputation of the destination.</li><li>Disposition: allow-list as benign, or escalate to incident response.</li></ol><p>We will walk through each of these technically in Part 2.</p><h3>Three (or four) ways to start a hunt</h3><p>NetWitness’ overview of <a href="https://www.netwitness.com/blog/types-of-network-threat-hunting/">network threat hunting types</a> groups hunts into three families. Splunk’s <a href="https://www.splunk.com/en_us/blog/security/peak-threat-hunting-framework.html">PEAK framework</a> adds a fourth. Here is how each looks on the wire:</p><ul><li><strong>Hypothesis-driven.</strong> You start from a testable statement. <em>“If an implant is using HTTPS C2 from our server VLAN, we will see regular outbound TLS sessions to a destination no other server talks to.”</em> Precise and efficient, but only as good as the hypothesis.</li><li><strong>Intelligence-driven.</strong> You start from external knowledge: a vendor report, an ISAC advisory, a CERT bulletin. <em>“Campaign X uses DNS TXT records for tasking and domains registered in the last week.”</em> Great for distributed environments where threats change faster than rules.</li><li><strong>Anomaly / baseline-driven.</strong> You start from what normal looks like and hunt the deviations: the one host talking to a new country, the only user-agent seen once, the server that suddenly uploads 20 GB. This finds novel attacks and insiders, but it needs mature data and analysts who know the environment.</li><li><strong>Model-assisted (M-ATH, from PEAK).</strong> You use statistics or machine learning to score behaviour — for example, a beacon score — and humans investigate the top of the list. RITA’s beacon scoring, which we use in Parts 2 and 3, is a simple version of this.</li></ul><p>In practice, good hunts mix them. A threat-intel report gives you the hypothesis; a baseline tells you what is abnormal; a model ranks the candidates.</p><p>PEAK’s three phases are also a useful wrapper for any hunt: <strong>Prepare</strong> (pick the topic, research, check that the data exists), <strong>Execute</strong> (analyse, pivot, investigate) and <strong>Act</strong> (document, automate the detection, communicate).</p><h3>Where hunting sits on the maturity curve</h3><p>Two classic models help explain why network hunting pays off.</p><p>The <strong>Hunting Maturity Model</strong> (David Bianco, originally at Sqrrl) goes from HMM0 (relies on automated alerting only) to HMM4 (most successful hunts are automated into detections). Most teams I work with sit at HMM1–HMM2: they collect data and can search for IOCs, but rarely create new analytics. Network hunting is one of the fastest ways to climb, because the analytics — duration, frequency, volume, rarity — are simple to express and automate.</p><p>Bianco’s <strong>Pyramid of Pain</strong> explains the other half. Blocking an IP or a hash costs the adversary almost nothing. Detecting their <em>behaviour</em> — how their C2 checks in, how their tunnel abuses DNS — is near the top of the pyramid and is expensive for them to change. Beacon timing and DNS subdomain patterns are behavioural. Rotating infrastructure does not make them go away.</p><h3>What you need to see: network data sources</h3><p>The <a href="https://www.puppygraph.com/blog/network-threat-hunting">PuppyGraph guide to network threat hunting</a> makes a point that is easy to forget: network evidence is only useful when you can connect it to <em>who</em> and <em>what</em>. You need the traffic, plus the context to tie an IP to a host, a user and a process. Here are the main sources and their trade-offs:</p><ul><li><strong>Full packet capture (PCAP)</strong> — tcpdump, Arkime, or a commercial recorder. Maximum fidelity: payloads, file carving, protocol reconstruction. Heavy on storage, so retention is often measured in days. Best for deep-dive validation, not for scanning months of history.</li><li><strong>Network security monitoring logs (Zeek)</strong> — Zeek turns packets into rich, structured logs: conn.log, dns.log, http.log, ssl.log, x509.log, files.log and more. Roughly 1–2% of the size of the PCAP, so you can keep months. This is the workhorse for most of what follows in this series.</li><li><strong>NetFlow / IPFIX / VPC flow logs</strong> — cheap, everywhere, built into routers, switches and cloud platforms. No application layer, and often sampled, so beacon and DNS analysis is limited. Still excellent for volume, rarity and east-west network hunting.</li><li><strong>Firewall and proxy logs</strong> — widely available; useful for egress analysis and URL/user-agent hunting. Quality varies by vendor; some firewalls only log session end.</li><li><strong>DNS logs</strong> — resolver query logs or passive DNS. Critical for DNS-based C2, DGA and newly-registered-domain hunts.</li><li><strong>Identity and asset context</strong> — DHCP leases, VPN sessions, authentication logs, CMDB/asset inventory. Without these, “10.1.4.37” is just a number.</li><li><strong>Endpoint telemetry</strong> — EDR network events or Sysmon Event ID 3 tie a connection to the process that made it. This is your pivot target after the network hunt finds something.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*oRAApjVa2LllCo8jzCWkTw.png" /><figcaption>Network Threat Hunting Hypotheses Ideas</figcaption></figure><h3>Sensor placement matters more than tools</h3><p>The best analytics fail if the sensor is in the wrong place. A few rules from the field:</p><ul><li><strong>Capture inside the egress firewall, before NAT.</strong> Otherwise every outbound connection appears to come from the firewall’s public IP and you lose the internal host.</li><li><strong>Capture before the internal DNS resolver forwards queries</strong>, or log on the resolver itself. Otherwise all DNS appears to come from the resolver.</li><li><strong>Do not ignore east-west traffic.</strong> Perimeter sensors see C2 and exfiltration, but not lateral movement between internal segments. Core switch SPANs or virtual TAPs in hypervisors and cloud VPCs close that gap.</li><li><strong>Measure your visibility before you hunt.</strong> Confirm that the sensor actually sees every egress path, including guest Wi-Fi, OT links, cloud egress and direct internet breakouts at branch offices.</li></ul><h3>Know the limits</h3><p>Network hunting is powerful, but it is not magic. Be honest about the blind spots:</p><ul><li><strong>Encryption.</strong> TLS 1.3, encrypted ClientHello (ECH) and DNS over HTTPS (DoH) hide content and, increasingly, destination names. <strong>You will rely more on metadata: timing, size, certificates, and fingerprints such as </strong><a href="https://github.com/FoxIO-LLC/ja4"><strong>JA4+</strong></a><strong>.</strong></li><li><strong>Volume.</strong> Unbounded searches across terabytes overwhelm analysts. Scope every hunt.</li><li><strong>Identity ambiguity.</strong> DHCP churn, NAT, shared proxies and cloud IPs that change owners make attribution harder.</li><li><strong>Noisy baselines.</strong> Software updaters, telemetry agents, chat clients and monitoring tools all beacon. Expect false positives and build an allow-list as you go.</li></ul><h3>What a successful hunt produces</h3><p>A hunt that “found nothing” is still a success if it produces outputs. At the end of every hunt you should have:</p><ol><li><strong>A disposition for every host in scope</strong> — benign, suspicious (needs more data), or compromised (escalated to IR).</li><li><strong>An updated allow-list</strong> of known-good long connections and beacons, with the business reason recorded.</li><li><strong>New or improved detections</strong> for anything that can be automated.</li><li><strong>A list of visibility gaps</strong> discovered along the way (missing logs, unmonitored network segments).</li><li><strong>Documentation</strong> of scope, data, queries and findings, so the hunt can be repeated.</li></ol><p>Measure the hunting program by those outputs — time-to-disposition, detections created, gaps closed — not by the number of hunts run.</p><h3>Coming up in Part 2</h3><p>In Part 2 we get our hands dirty. We will hunt C2 the way an analyst actually does it: finding long connections and beacons in Zeek conn.log, catching DNS tunnels by counting unique subdomains, spotting outliers in bytes, user-agents and certificates, and scoring each finding so you can make a defensible call.</p><h3>References and further reading</h3><ul><li>Active Countermeasures — <a href="https://www.activecountermeasures.com/how-to-threat-hunt-your-network/">How to Threat Hunt Your Network</a></li><li>Active Countermeasures — <a href="https://www.activecountermeasures.com/wp-content/uploads/2021/02/Network-Threat-Hunting-202102.pdf">Network Threat Hunting training slides (PDF)</a></li><li>PuppyGraph — <a href="https://www.puppygraph.com/blog/network-threat-hunting">Network Threat Hunting</a></li><li>NetWitness — <a href="https://www.netwitness.com/blog/types-of-network-threat-hunting/">Types of Network Threat Hunting</a></li><li>Splunk SURGe — <a href="https://www.splunk.com/en_us/blog/security/peak-threat-hunting-framework.html">The PEAK Threat Hunting Framework</a></li><li>Mandiant — <a href="https://cloud.google.com/blog/topics/threat-intelligence/m-trends-2026">M-Trends 2026</a></li><li>SANS — <a href="https://www.sans.org/cyber-security-courses/advanced-network-forensics-threat-hunting-incident-response">FOR572: Advanced Network Forensics: Threat Hunting, Analysis, and Incident Response</a></li></ul><p>Long Live Cyber Defenders!!!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=be41c6dfeb77" width="1" height="1" alt=""><hr><p><a href="https://medium.com/fmisec/hunting-on-the-wire-a-practical-guide-to-network-threat-hunting-part-1-be41c6dfeb77">Hunting on the Wire : A Practical Guide to Network Threat Hunting — Part 1</a> was originally published in <a href="https://medium.com/fmisec">FMI Cyber Security Consulting Services</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[IoT Security: Securing File Transfers Over Untrusted Channels]]></title>
            <link>https://medium.com/fmisec/iot-security-securing-file-transfers-over-untrusted-channels-b5daabe66713?source=rss----5aebc5961dd0---4</link>
            <guid isPermaLink="false">https://medium.com/p/b5daabe66713</guid>
            <category><![CDATA[iot-security]]></category>
            <category><![CDATA[iot]]></category>
            <category><![CDATA[research]]></category>
            <category><![CDATA[cybersecurity]]></category>
            <category><![CDATA[cryptography]]></category>
            <dc:creator><![CDATA[Farhan Nurohman]]></dc:creator>
            <pubDate>Wed, 07 Oct 2026 02:01:02 GMT</pubDate>
            <atom:updated>2026-10-07T02:01:02.511Z</atom:updated>
            <content:encoded><![CDATA[<p><em>I implemented Ascon (the NIST lightweight cryptography standard) and X25519 key exchange on a 240 MHz microcontroller, then measured the performance. Here are the figures and the takeaways for anyone building a file transfer protocol.</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Lh1rAsv6nUoD6kl2ppkZwA.png" /></figure><h4><strong>Why File Transfer?</strong></h4><p>Between 2020 and 2025, the same extortion group — Cl0p — executed an identical playbook against four consecutive managed file transfer products: Accellion FTA, Fortra GoAnywhere, Progress MOVEit, and the Cleo product suite. The 2023 MOVEit campaign alone impacted over 2,700 organizations and more than 90 million individuals. Exploitation of the Cleo flaw was still active as late as February 2025.</p><p>Note what didn’t happen there. No AES was cracked. No elliptic curve collapsed. What was exploited was SQL injection, authentication bypass, and remote code execution in software sitting at the perimeter — software that held the organizations’ most sensitive data.</p><p>This is the first lesson, and it’s worth stating up front so it doesn’t get lost: <strong>the strength of your cipher is the easiest part of the problem.</strong> The hard parts are protocol design, key handling, and verification discipline.</p><p>But there’s another side of the spectrum that’s rarely discussed. At the opposite end from enterprise-grade MFT servers lies a far more resource-constrained class of data transfer: small devices sending data over narrow channels with no supporting infrastructure at all. No TLS, no certificate authority, no internet connection. There, data transfer often happens <strong>with no encryption whatsoever</strong> — not because nobody cares, but because of the prevailing assumption that cryptography is too expensive for devices that small.</p><h4>Four Questions, One Primitive.</h4><p>Every file transfer protocol — from SCP to S3 multipart uploads — must address four aspects:</p><ul><li><strong>Confidentiality</strong> — can an intermediary read the contents? This is the one everyone remembers.</li><li><strong>Integrity</strong> — large files are split into chunks. If an attacker swaps chunk five with one from another file, reorders chunks, or truncates the transfer mid-way while claiming it’s complete, the received file is corrupted without anyone noticing. This one gets overlooked.</li><li><strong>Authenticity</strong>— a valid chunk that’s recorded and replayed remains cryptographically valid unless a sequence number is bound into the authentication.</li><li><strong>Forward secrecy</strong> — your keys will eventually leak. The question is how much becomes exposed when they do. With one static key for the system’s whole lifetime, the answer is: everything, including traffic an attacker recorded three years ago.</li></ul><p><strong>AEAD </strong>addresses the first three all at once:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/521/1*bblV5Ik2URCUeCW2R2nxXA.png" /></figure><p>A stands for associated data: it is unencrypted but is also authenticated. This is where the chunk number, the last chunk marker, and the sender’s ID are placed — plaintext, but cannot be modified without causing the tag verification to fail.</p><p>Proper AEAD returns a <strong>failure</strong>, not garbage plaintext, when the tag doesn’t match. This isn’t an academic detail: when the Ascon-AEAD128 implementation was submitted to OpenSSL, one review finding was that decryption released the plaintext <em>before</em> tag verification completed. Bugs of that class still happen in the most heavily audited project in the world.</p><h4>Ascon &amp; X25519</h4><p>On August 13, 2025, NIST finalized <strong>SP 800–232</strong>, a lightweight cryptography standard built on the Ascon family — including Ascon-AEAD128, Ascon-Hash256, and its XOF variant. Ascon had previously won as the primary lightweight-encryption choice in the CAESAR competition.</p><p>What makes it interesting: a sponge/duplex construction with a 320-bit state, no key schedule to expand and store, and no S-box lookup tables in memory — so no cache-timing leakage from lookup tables either. A single permutation handles encryption, hashing, and key derivation, so an entire protocol can be built from one primitive: Ascon-XOF works as a KDF out of the box, no need to import HKDF-SHA256 separately. Library support is moving: wolfSSL added it in April 2025, with OpenSSL support following.</p><blockquote>⚠️ <strong>Ascon v1.2 ≠ SP 800–232.</strong> The final standard changes the initial value, adjusts to little-endian formatting for microcontroller performance, and adds options such as nonce masking. The test vectors differ. I implemented v1.2; if you need interoperability today, target SP 800–232.</blockquote><p>For key exchange, X25519 beats NIST P-256 on all three metrics that matter on constrained devices: 523 ms, 47 KB, 55 mW, versus P-256’s 1,582 ms, 64 KB, 103 mW (Tanksale 2024, 48 MHz MCU).</p><p>But more important than the choice of curve is its <strong>ephemerality</strong>. A key pair generated fresh for each session and discarded afterward means a leak today doesn’t unlock yesterday’s recordings. The age file encryption format does exactly this: for every single file, a new ephemeral X25519 key is generated and run through ECDH against the recipient&#39;s public key to wrap the file key.</p><p>One caveat: raw ECDH is vulnerable to man-in-the-middle (MitM) attacks. Without authentication, an attacker can swap both public keys, establish two separate shared secrets, and read everything in between. <strong>ECDH provides confidentiality, not identity.</strong></p><h4>The Design</h4><p>Two layers of keys. A static pre-shared key (PSK), provisioned onto both devices in advance, is used <strong>only</strong> to authenticate the handshake — never to encrypt data. A session key derived via ECDH handles the actual data chunks. This separation is what makes the scheme work: the PSK isn’t repeatedly exposed with every chunk, and a leaked session key doesn’t compromise any other session, past or future.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*UjnhN6e7WTZmiA-dI18uGw.png" /></figure><p>Four decisions worth highlighting:</p><ul><li><strong>The ephemeral public key is sent encrypted and authenticated under the PSK.</strong> This is what closes the MitM hole — an attacker without the PSK can’t inject their own public key, since the handshake packet would fail tag verification.</li><li><strong>The counter doubles as the nonce and lives in the associated data.</strong> The receiver reconstructs the nonce without it ever being sent in full, and because the counter is authenticated, it can’t be forged for a replay.</li><li><strong>Verification order: counter first, tag second.</strong> Stale packets are rejected with zero cryptographic operations.</li><li><strong>Ephemeral private keys and shared secrets are explicitly zeroed</strong> immediately after the session key is derived. Without this step, forward secrecy is a claim on paper, not in practice.</li></ul><blockquote>Data frame: ID 2 · counter 8 · timestamp 4 · ciphertext 8 · tag 16 = 38 bytes. Handshake frame: ID 2 · nonce 8 · pubkey 32 · tag 16 = 58 bytes.</blockquote><p>For an 8-byte chunk, the cryptographic overhead is nearly four times the size of the data — the worst-case scenario that could be designed. For a 64 KiB chunk, that same overhead becomes 0.05%.</p><h4>The Result</h4><p>Before any measurement was taken: X25519 was checked against the RFC 7748 test vectors; Ascon-128 against the reference implementation, including 400 random combinations of AD length and plaintext length; plus negative tests with a corrupted tag, corrupted ciphertext, and corrupted AD. A crypto implementation that runs without errors doesn’t mean it’s correct — broken encryption still produces convincing-looking random bytes.</p><blockquote>Hardware: ESP32 at 240 MHz, LoRa SX1276, SF7/BW125. The four schemes were run round-robin so environmental drift would be spread evenly across all of them.</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/610/1*SCiqVvWqCnfcCtoV7CkA4g.png" /></figure><p><strong>ECDH is practically free.</strong> The difference between the second and third rows is 230 cycles and 0.14 KB of RAM, in exchange for forward secrecy and MitM resistance. The handshake itself takes 342.6 ms, but since it happens only once every 100 chunks, it amortizes to 3.43 ms per chunk — <strong>0.17%</strong> of the send interval.</p><p><strong>Ascon needs about 35% fewer cycles than AES-GCM for decryption</strong> (25,273 vs. 38,631 — equivalently, AES-GCM takes roughly 53% more cycles than Ascon), even though the ESP32 has an AES hardware accelerator. The reason: the accelerator handles the AES block cipher, but GHASH still runs in software, and on an 8-byte payload, the GHASH overhead outweighs whatever the accelerator saves.</p><blockquote>This finding <strong>reverses</strong>, though, on 64 KiB chunks on a CPU with AES-NI. AES-GCM’s per-byte cost drops sharply, while Ascon stays bound to a fixed number of permutation rounds per 8-byte block. Ascon’s advantage is an advantage <strong>on constrained devices with short messages</strong>, not a universal one.</blockquote><p>This is why age chose ChaCha20-Poly1305 over AES-GCM: not because AES is weak, but because AES is hard to make fast <em>and</em> safe without hardware support. Pick a primitive based on the platform and message size, not on whichever was standardized most recently.</p><p>Five attack scenarios were run against separate attacker nodes. Ascon+ECDH withstood eavesdropping, injection, replay, and MitM-on-handshake. The static-PSK scheme withstood eavesdropping, injection, and replay too — MitM-on-handshake doesn’t apply to it, since it has no ECDH handshake to attack — but it failed the one test that actually matters for key compromise: forward secrecy. I recorded three key-rotation periods, leaked the second period’s session key, and tried decrypting the other two. With static PSK, all three periods were exposed. With Ascon+ECDH, periods 1 and 3 both <strong>failed tag verification</strong> — rejecting the packets outright rather than handing the application incorrect plaintext.</p><p>Now for the part that usually doesn’t make it into articles like this. I flooded the channel with fake chunks:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/492/1*9k19ye-vToXzi8E1aZvjLw.png" /></figure><p>The cryptographic side works perfectly. Zero forged packets got through, and verification latency stayed flat regardless of attack rate. <strong>And availability still dropped to 20%.</strong></p><p>Confidentiality, integrity, and authenticity are three properties. Availability is a fourth, and cryptography doesn’t provide it — that’s handled elsewhere, with rate limiting, channel scheduling, and per-identity quotas. Tie that back to MOVEit: those organizations used TLS; their data was encrypted in transit. What failed was authorization and input validation sitting on top of the cryptography.</p><h4>Limitations</h4><p>Test conditions were controlled: two nodes, 1-meter distance, line-of-sight. The payload was a fixed 8 bytes, so Ascon’s partial-block code path never executes during application use (though it was verified separately via multi-block test vectors). Performance figures don’t generalize across platforms — 24,624 cycles on the Xtensa LX6 doesn’t map directly onto Cortex-M or x86–64. This is an Ascon v1.2 implementation, not SP 800–232. Side-channel analysis is out of scope; any crypto implementation needs an independent audit before production use. And as shown above, availability under flooding was not addressed by the cryptographic design at all.</p><h4>Conclusion</h4><p>Lightweight cryptography is mature enough for serious use now. Ascon has a NIST standard behind it, and on small devices with short messages it beats AES-GCM by a wide margin. Ephemeral key exchange is nearly free — systems still running on a static key for the device’s entire lifetime are carrying technical debt that will eventually come due. Framing details decide everything: chunk numbers and end-markers bound into the associated data are the difference between a secure transfer and an encrypted one that can still be truncated or scrambled. And correct cryptography is a prerequisite, not a guarantee — all four MFT products breached over those four years used sound encryption. The failure was never in the cipher.</p><p>Reference: <a href="https://repository.ipb.ac.id/handle/123456789/178628">Implementation of Lightweight Cryptography Ascon and Elliptic Curve Diffie-Hellman (ECDH) on LoRa Data Transmission Mechanism</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b5daabe66713" width="1" height="1" alt=""><hr><p><a href="https://medium.com/fmisec/iot-security-securing-file-transfers-over-untrusted-channels-b5daabe66713">IoT Security: Securing File Transfers Over Untrusted Channels</a> was originally published in <a href="https://medium.com/fmisec">FMI Cyber Security Consulting Services</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Kunai Engineering #1 — Building Linux Threat Detection with Kunai on Ubuntu Server]]></title>
            <link>https://medium.com/fmisec/kunai-engineering-1-building-linux-threat-detection-with-kunai-on-ubuntu-server-a8d66178f439?source=rss----5aebc5961dd0---4</link>
            <guid isPermaLink="false">https://medium.com/p/a8d66178f439</guid>
            <category><![CDATA[threat-detection]]></category>
            <category><![CDATA[blue-team]]></category>
            <category><![CDATA[detection-engineering]]></category>
            <category><![CDATA[linux-threat-hunting]]></category>
            <category><![CDATA[linux-dfir]]></category>
            <dc:creator><![CDATA[Christopher Ryan]]></dc:creator>
            <pubDate>Thu, 01 Oct 2026 02:01:02 GMT</pubDate>
            <atom:updated>2026-10-01T02:01:02.382Z</atom:updated>
            <content:encoded><![CDATA[<p>Linux provides a wide range of tools for monitoring system activity, including auditd, Sysmon for Linux, Falco, and osquery. However, gaining meaningful security visibility often requires combining multiple tools and data sources. This is where <strong>Kunai</strong> comes in, bringing system monitoring capabilities together with a focus on security visibility.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*pY6uaKX8gBWs5u6rJzdVsQ.png" /></figure><p>Kunai (<a href="https://why.kunai.rocks/">https://why.kunai.rocks/</a>) is built specifically for Linux threat hunting, using <strong>eBPF</strong> and <strong>Rust</strong> to collect and analyze system activity. It can also monitor activity inside containers and apply the same threat-hunting rules across them.</p><p>In this article, I’ll walk through my setup of Kunai v0.7.0-rc.1 on <strong>Ubuntu Server 24.04</strong>, from enabling BPF LSM and installing Kunai to configuring it and creating a simple detection rule.</p><h3>1. Enabling BPF LSM</h3><p>First, check the currently enabled Linux Security Modules:</p><pre>cat /sys/kernel/security/lsm</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/944/1*pvZrcKFmNfDHbZd8SLNXUg.png" /></figure><p>Kunai’s hardening mode requires <strong>bpf </strong>to be present in this list.</p><p>We need to add the LSM configuration to GRUB, Instead of editing /etc/default/grub manually using nano, the following command updates GRUB_CMDLINE_LINUX_DEFAULT using sed.</p><pre>sudo sed -i \<br>&#39;s/^GRUB_CMDLINE_LINUX_DEFAULT=.*/GRUB_CMDLINE_LINUX_DEFAULT=&quot;lsm=lockdown,capability,landlock,yama,apparmor,bpf&quot;/&#39; \<br>/etc/default/grub</pre><p>Verify the configuration:</p><pre>sudo cat /etc/default/grub</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/975/1*i_3ywt92AGFzPhQ5S_Z4nw.png" /></figure><p>Then update GRUB and reboot:</p><pre>sudo update-grub<br>sudo reboot</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/975/1*NVTAWohz4_Fgf7yf9wlsxw.png" /></figure><p>After reboot, verify it:</p><pre>cat /sys/kernel/security/lsm</pre><p>You should see:</p><pre>lockdown,capability,landlock,yama,apparmor,bpf</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/916/1*NPQ1aPK7cAKFwjyc_t2Dzg.png" /></figure><p>This step is important because Kunai’s --harden installation checks for BPF LSM before continuing.</p><h3>2. Download and Configure Kunai</h3><p>Create a working directory:</p><pre>mkdir Kunai<br>cd Kunai</pre><p>Download the Kunai release and make the binary executable.</p><pre>wget https://github.com/kunai-project/kunai/releases/download/v0.7.0-rc.1/kunai-amd64</pre><pre>chmod +x ./kunai-amd64</pre><p>Then generate the default configuration:</p><pre>./kunai-amd64 config --dump &gt; kunai.conf</pre><p>Move the configuration into the Kunai configuration directory:</p><pre>sudo mkdir -p /etc/kunai/<br>sudo mv ./kunai.conf /etc/kunai/kunai.conf</pre><h3>3. Install Kunai as a Systemd Service</h3><p>Now install Kunai with hardening and systemd support:</p><pre>sudo ./kunai-amd64 install \<br>--config /etc/kunai/kunai.conf \<br>--systemd \<br>--enable-unit \<br>--harden</pre><p>The important options are:</p><ul><li>--config — specifies the Kunai configuration.</li><li>--systemd — creates a systemd service.</li><li>--enable-unit — enables the service.</li><li>--harden — enables the hardened installation checks.</li></ul><p>After installation, check the generated events:</p><pre>sudo systemctl start kunai<br>sudo tail -f /var/log/kunai/events.log</pre><p>At this point, Kunai should be collecting system activity.</p><p>For better tuning, In my setup I disabled send_data to reduce unnecessary event generation.</p><pre>sudo systemctl stop kunai<br>sudo nano /etc/kunai/kunai.conf<br>sudo systemctl restart kunai</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/398/1*nJBzEX5AGjDK_q8kGf4a5A.png" /></figure><h3>4. Creating a Detection Rule</h3><p>Kunai can monitor all system events, providing deep visibility but generating a large volume of data. Detection rules allow users to focus only on specific events and behaviors that matter for security monitoring.</p><p>This is where Kunai Detection rules become useful.</p><p>Create a rules directory:</p><pre>sudo mkdir -p /etc/kunai/rules/</pre><p>Create a rule file:</p><pre>sudo nano /etc/kunai/rules/example_rule.kunai</pre><p>For example, we can detect a binary pretending to be a Linux kernel worker thread:</p><pre>name: mimic.kthread<br>type: detection<br>meta:<br>  tags: [ &#39;os:linux&#39; ]<br>  attack: [ T1036 ]<br>  authors: [ qjerome ]<br>  comments:<br>    - tries to catch binaries masquerading kernel threads<br>match-on:<br>  events:<br>    kunai: [execve, execve_script]<br>matches:<br>  $task_is_kthread: .info.task.flags &amp;= &#39;0x200000&#39;<br>  $kthread_names: .info.task.name ~= &#39;^(kworker)&#39;<br>condition: not $task_is_kthread and $kthread_names<br>severity: 10</pre><p>The idea is simple:</p><blockquote><em>The rule evaluates fields from the Kunai event itself. </em><em>.info.task.flags is used to determine whether the task has the kernel-thread flag, while </em><em>.info.task.name is checked for the </em><em>kworker naming pattern. The final condition triggers when those two properties don&#39;t match.</em></blockquote><p>The rule also maps the behavior to <strong>MITRE ATT&amp;CK T1036</strong>, which is associated with masquerading.</p><p>Then update the main Kunai configuration so it knows where the detection rules are stored.</p><pre>sudo nano /etc/kunai/kunai.conf</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/975/1*TSorFq9gA7ef_oLjcJEf-A.png" /></figure><p>Then restart Kunai:</p><pre>sudo systemctl restart kunai</pre><p>This command below creates a benign test case where a normal user-space binary is given a name resembling a Linux kernel worker thread. When the binary executes, Kunai should see the execve event and evaluate it against the detection rule</p><pre>cp /usr/bin/ls /tmp/kworker<br>/tmp/kworker</pre><p>Now search the Kunai log for the detection:</p><pre>sudo grep -RniE &#39;mimic.kthread&#39; \<br>/var/log/kunai/events.log 2&gt;/dev/null | tail -50</pre><p>If the rule is working, Kunai should report the detection.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/975/1*0UQbM2teHP0wqLcwQstt1w.png" /></figure><h3>Beyond Detection Rules</h3><p>Detection rules are only one part of Kunai’s capabilities. Kunai also provides mechanisms for filtering events, scanning for indicators of compromise, and taking automated response actions.</p><p>For example, Kunai can be integrated with YARA-based scanning to inspect files for known patterns, while automated actions can be used to respond to detected activity. These capabilities allow Kunai to move beyond passive monitoring toward a more active detection and response workflow.</p><p>In this article, however, we focused on the fundamentals: collecting Linux telemetry, understanding Kunai events, creating a detection rule, and validating that detection with a controlled test.</p><h3>Conclusion</h3><p>Setting up Kunai is more than simply installing a security agent. The combination of <strong>eBPF visibility</strong> and <strong>custom detection rules</strong> makes Kunai useful for investigating Linux activity and building practical threat detections.</p><p>The important lesson is to start with visibility, understand the events being generated, and then create focused rules for the behavior you actually want to detect.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a8d66178f439" width="1" height="1" alt=""><hr><p><a href="https://medium.com/fmisec/kunai-engineering-1-building-linux-threat-detection-with-kunai-on-ubuntu-server-a8d66178f439">Kunai Engineering #1 — Building Linux Threat Detection with Kunai on Ubuntu Server</a> was originally published in <a href="https://medium.com/fmisec">FMI Cyber Security Consulting Services</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Threat Hunting & Compromise Assessment in SentinelOne Singularity Platform]]></title>
            <link>https://medium.com/fmisec/threat-hunting-compromise-assessment-in-sentinelone-singularity-platform-88eeb1e1c2b0?source=rss----5aebc5961dd0---4</link>
            <guid isPermaLink="false">https://medium.com/p/88eeb1e1c2b0</guid>
            <category><![CDATA[blue-team]]></category>
            <category><![CDATA[sentinelone]]></category>
            <category><![CDATA[cyber-defense]]></category>
            <category><![CDATA[threat-hunting]]></category>
            <category><![CDATA[digital-forensics]]></category>
            <dc:creator><![CDATA[Reyhan]]></dc:creator>
            <pubDate>Mon, 28 Sep 2026 02:01:03 GMT</pubDate>
            <atom:updated>2026-09-28T02:01:02.870Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*xCOl3yhQynVDEsKxdkVL5g.png" /><figcaption>SentinelOne Singularity Operations Center UI. Source: <a href="https://www.procufly.com/blog/sentinelone-singularity-cybersecurity-platform-procufly-reseller-across-cyprus-the-eu">ProCufly</a></figcaption></figure><p><strong>Tracing a Web RCE All the Way to Lateral Movement, Before Any Alert Fired</strong></p><p>This one starts with an assumption, a company has already been compromised. A threat actor got in through a vulnerability, quietly established a foothold, and SentinelOne hasn’t raised a single alert about it yet. My job here isn’t to wait for a detection to fire, it’s to go looking for the intrusion myself and see how far it went.</p><p>So that’s what I’ll walk through. I’ll trace the whole thing from the very first suspicious process, follow the chain step by step, and rebuild the full attack path from raw telemetry alone. At the end I’ll share the attack topology, the mitigation steps I took, and the indicators of compromise so you can reuse them.</p><blockquote><strong><em>Note: </em></strong><em>Make sure Singularity Operations Center is turned on </em><strong><em>(Preferences &gt; Features)</em></strong><em> so you have access to all the modules used here, from Event Search and Storyline to Graph, Forensic Collection, and RemoteOps.</em></blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/679/1*KGphYfU9uZUAWJtLTVdhZg.png" /><figcaption>Enabling Singularity Operations Center under My Preferences</figcaption></figure><p>There are two endpoints in scope, both already running the SentinelOne sensor:</p><ul><li><strong>Linux (Web Server):</strong> runs the company’s public-facing web app.</li><li><strong>Windows (Workstation):</strong> a regular employee’s machine on the same network.</li></ul><p>Worth stressing up front: I’m going in assuming a breach already happened, but with zero alerts on the board. Everything below comes purely from hunting through raw telemetry, not from anything the detection engine handed me.</p><h3>Finding the Entry Point (T1190)</h3><p>Since one of the endpoints is an internet-facing server, my first hypothesis is Exploitation of a <strong>Public-Facing Application (T1190)</strong>. The reasoning is simple, if someone broke in through the web app, the evidence should show up as the web service behaving in a way it normally never would. I ran the hunt in MITRE ATT&amp;CK order, earliest stage first, so the story reads cleanly and I don’t skip a link in the chain.</p><p>First I head into Event Search and set up the filter:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*wd_pSscSRTghbzTmiUvbjw.png" /><figcaption>Event Search with the T1190 Query</figcaption></figure><p>The point of this T1190 query isn’t to look for malware. It’s to look for a relationship, a web app process (python3, python, node) becoming the parent of a shell process (sh, bash, dash). A healthy web server serves requests and returns pages, it has no reason to spawn a shell. The moment that pattern shows up, it’s a strong candidate for command injection or RCE.</p><pre>| filter( event.type == &quot;Process Creation&quot;<br>  AND src.process.name contains:anycase( &quot;python3&quot;,&quot;python&quot;,&quot;node&quot; )<br>  AND tgt.process.name in:matchcase( &quot;sh&quot;,&quot;bash&quot;,&quot;dash&quot; ) )<br>| columns event.time, event.id, event.type, site.id, site.name,<br>  agent.uuid, timestamp, src.process.storyline.id, src.process.user,<br>  src.process.cmdline, src.process.image.path, tgt.process.storyline.id,<br>  tgt.process.cmdline, tgt.process.image.path<br>| sort - timestamp<br>| limit 1000</pre><p>The query returns results, and once I scroll across to the command line, one row jumps straight out.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*7tHDar63vGH71WPf-mebpA.png" /><figcaption>The Suspicious Row</figcaption></figure><p>If you look closely at that command line. It opens with <strong>host -t MX example.com</strong>, a legitimate-looking DNS lookup, then chains two completely unrelated commands after a semicolon, <strong>chmod +x</strong> on a file in the uploads directory, then running that file in the background. That’s the classic fingerprint of command injection. The original feature only meant to verify a domain, but because the input wasn’t validated, the attacker slipped extra commands in through the shell separator. One shell running several unrelated commands is a lot more telling than just seeing python spawn sh, and that’s what pushes this from odd to genuinely bad.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*B8FpzWhoJWhswmijH35auQ.png" /><figcaption>Event Detail</figcaption></figure><p>I click the Source Process Unique ID on that row to jump into a new tab opens showing the process lineage, <strong>python3 app.py</strong> as the source, spawning <strong>/bin/sh</strong> as the target, which then runs the injected commands. Purple AI also flags that both processes are unsigned and are executing a file out of the uploads directory, two more reasons to be suspicious.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*hD5qC3YJJVfPA30gcZiH2Q.png" /><figcaption>The Source Process Parent StoryLineID</figcaption></figure><p>From this detail page I grab the single most useful artifact for the rest of the investigation, the Source Process (Parent) StoryLine ID. In SentinelOne, the Storyline ID is the thread that ties every child process from one root activity into a single story. Once I have that ID, I can rebuild the whole chain without guessing.</p><p><strong>Pivoting on the Storyline ID</strong></p><p>Now I filter again, this time not by process pattern but by the Storyline ID that I just grabbed.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*BBJ5d5K1KcuBSx1fqhoJsg.png" /><figcaption>Filtering by StoryLineID</figcaption></figure><pre>| filter(src.process.storyline.id &quot;d1c3a4d8-0c76-55cd-2b32-3e4dee33f4fa&quot; <br>OR tgt.process.storyline.id &quot;d1c3a4d8-0c76-55cd-2b32-3e4dee33f4fa&quot; )<br>| columns event.time, event.id, event.type, site.id, site.name, agent.uuid,<br>timestamp, src.process.storyline.id, src.process.user, src.process.uid,<br>src.process.cmdline, src.process.image.path, tgt.process.storyline.id,<br>tgt.process.user, tgt.process.uid, tgt.process.cmdline, <br>tgt.process.image.path<br>| sort timestamp<br>| limit 1000</pre><p>A process named <strong>update_agent</strong> shows up, running out of <strong>/home/rocky/apps/uploads/update_agent</strong>. The name is picked on purpose to sound like a legitimate update process, a common masquerading trick so it doesn’t draw attention when an analyst skims a process list. But the context gives it away, a binary running from a web app’s upload directory is not a normal update. This is our implant candidate, and it becomes the center of the next few steps.</p><h3>Confirming the Download Path (T1105)</h3><p>To find out how update_agent landed on the server, I check for a shell process downloading over curl or wget, mapping to Ingress Tool Transfer (T1105).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*giZ-h9kPkx9oeZBofJvDRg.png" /><figcaption>The T1105 Query</figcaption></figure><pre>| filter( event.type == &quot;Process Creation&quot;<br>  AND tgt.process.name in:anycase( &quot;curl&quot;,&quot;wget&quot; )<br>  AND tgt.process.cmdline contains:anycase( &quot;http&quot; ) )<br>| columns event.time, event.id, event.type, site.id, site.name,<br>  agent.uuid, timestamp, src.process.storyline.id, src.process.user,<br>  src.process.cmdline, src.process.image.path, tgt.process.storyline.id,<br>  tgt.process.user, tgt.process.uid, tgt.process.cmdline, tgt.process.image.path<br>| sort - timestamp | limit 1000</pre><p>Confirmed. There’s a curl process pulling the file from an external server, and that’s where I get the suspicious IP. I click the curl process to open its Storyline, and there’s a run of bash child processes worth digging into.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ZmEbGzODnFzTDY3l17gJmQ.png" /><figcaption>StoryLine for the Curl Process</figcaption></figure><p>This Storyline shows a textbook post-exploitation pattern, after getting a foothold, the attacker runs curl to pull the payload, mixes in id to check what privileges they have, and grep to sift through information. That’s not an app doing its job automatically, that’s a human getting oriented inside a system they just took over. The download destination, <strong>192.168.122.20</strong>, becomes the key indicator I chase next.</p><h3>Validating Command and Control (C2) Communication</h3><p>An implant is useless to an attacker if they can’t control it. Since I already have that suspicious IP, the logical next move is to prove whether the compromised server actually reaches back out to it, the Command &amp; Control channel.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*RdWA767znDmE8NYqO-ej_A.png" /><figcaption>Outbound Outgoing Connection</figcaption></figure><pre>| filter(event.type &quot;IP Connect&quot; AND src.ip.address &quot;192.168.122.11&quot; AND <br>dst.ip.address &quot;192.168.122.20&quot;)<br>| columns event.time, event.id, event.type, site.id, site.name, agent.uuid,<br>timestamp, src.process.storyline.id, src.process.user, src.process.uid,<br>src.process.cmdline, src.process.image.path, src.ip.address, src.port.number,<br>dst.ip.address,<br>dst.port.number, event.network.direction, event.network.protocolName,<br>event.network.connectionStatus<br>| sort timestamp<br>| limit 1000</pre><p>Three columns settle it here, the OUTGOING direction, destination port <strong>8080 (http-alt)</strong>, and the SUCCESS status. Together they confirm the implant isn’t just sitting there, it established two-way communication with the attacker’s infrastructure. <strong>Port 8080</strong> over something that looks like HTTP is a deliberate choice, C2 traffic is often dressed up as web traffic so it blends into normal outbound flow and slips past perimeter inspection. From a defender’s seat, a single <strong>SUCCESS</strong> connection to an unknown IP like this is enough to move the case from suspicion to confirmed.</p><p>Then I click the <strong>update_agent</strong> process to open its Storyline. Scrolling down, another important find turns up, a crontab process, which tells me the attacker planted a way to keep their payload alive, in other words, persistence.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Lf4WigiPIZztdewRJElTig.png" /><figcaption>Update Agent StoryLine</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*B3WKxcHDnssl1FFN9rObug.png" /><figcaption>Detail of the Crontab Process</figcaption></figure><p>The crontab confirms persistence (T1053.003). The payload is scheduled to re-run on its own, so rebooting the server or killing the process alone won’t remove it. Eradication later needs to clear this cron entry too, not just the implant file.</p><h3>Lateral Traversal to Secondary Victim (T1021.004)</h3><p>After taking the web server, the next step is checking for lateral movement. I move to T1021.004 (Remote Services: SSH) and look for an outbound SSH connection from the compromised server to another endpoint.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*hs-BDfqX2aX21iJ69TH4mA.png" /><figcaption>Outbound SSH from 192.168.122.11</figcaption></figure><pre>| filter( event.type == &quot;IP Connect&quot; AND dst.port.number == 22 )<br>| columns event.time, event.id, site.id, site.name, agent.uuid,<br>  timestamp, src.process.storyline.id, src.process.user,<br>  src.process.cmdline, src.process.image.path, src.ip.address,<br>  src.port.number, dst.ip.address, dst.port.number,<br>  event.network.direction, event.network.protocolName,<br>  event.network.connectionStatus<br>| sort - timestamp | limit 1000</pre><p>Scrolling across makes it obvious, there’s an ssh command line heading to a different endpoint, from the web server <strong>(192.168.122.11)</strong> to the employee <strong>workstation (192.168.122.12)</strong>, using the accounts <strong>budi</strong>, <strong>Budi</strong>, and <strong>luminousvl</strong>.</p><p>To confirm the jump actually landed on the other side, I check the Storyline on the destination endpoint.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*lG3RP9aohcdjuKf3N8a0pA.png" /><figcaption>StoryLine on <em>DESKTOP-H70VSEP</em></figcaption></figure><p>Trying three different account names <strong>(budi, Budi, luminousvl)</strong> shows the attacker testing the credentials they found, and <strong>sshd-session.exe</strong> appearing on the Windows side proves at least one attempt worked. This is the moment the attack crosses platforms, from Linux to Windows, which makes it a lot more dangerous, from a server you might have assumed was isolated, the attacker now has a foothold on an employee’s workstation, much closer to user data and identities.</p><blockquote><strong><em>Key hunting point: </em></strong><em>Up to here, SentinelOne still hasn’t raised a single alert. Around 23:36 there’s nothing yet that trips an automatic detection. The entire chain so far, initial access, C2, persistence, and lateral movement, was uncovered purely through proactive hunting. That’s exactly how attacker dwell time gets long when you only rely on alerts.</em></blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*MED4tEfRBaU6RgKfmounsw.png" /><figcaption>There;s no alert from SentinelOne</figcaption></figure><h3>Impact &amp; the First Alert (T1490)</h3><p>With lateral movement onto the workstation confirmed, I filter Process Creation for trusted Windows executables used to modify or delete system state, a common pre-ransomware pattern mapping to Inhibit System Recovery (T1490).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*5MvNzeRyGfc2fQH-eH0hlA.png" /><figcaption>T1490 Query Filter</figcaption></figure><pre>| filter(event.type == &quot;Process Creation&quot; AND <br>(tgt.process.name in: anycase(&quot;vssadmin.exe&quot;, &quot;wbadmin.exe&quot;,<br>&quot;cipher.exe&quot;, &quot;wmic.exe&quot;, &quot;bcdedit.exe&quot;, &quot;diskshadow.exe&quot;,<br>&quot;fsutil.exe&quot;, &quot;wevtutil.exe&quot;, &quot;schtasks.exe&quot;, &quot;reg.exe&quot;)<br>OR tgt.process.cmdline<br>contains: anycase(&quot;delete&quot;)))<br>| columns event.time, event.id, site.id, site.name, agent.uuid,<br>src.process.storyline.id, src.process.user, src.process.uid,<br>src.process.cmdline, src.process.image.path, tgt.process.storyline.id,<br>tgt.process.user, tgt.process.uid, tgt.process.cmdline,<br>tgt.process.image.path<br>| sort event.time<br>| limit 1000</pre><p>I click through to the process Storyline, and you can see how busy the attacker got on this box, a long run of processes in a short window.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*aecYQt7jdHXSiYzrejqoew.png" /><figcaption>StoryLine Process on DESKTOP-H70VSEP</figcaption></figure><p>One <strong>cmd.exe</strong> branches into <strong>vssadmin.exe</strong> (shadow copy deletion, T1490) alongside whoami, net, nltest, and netstat, discovery commands mapping privileges, accounts, domain trust, and network state. This discovery-then-destroy sequence is a standard pre-ransomware pattern. Notably, it’s this destructive activity, not the initial access, that finally crosses SentinelOne’s detection threshold.</p><p>Sure enough, this is where SentinelOne finally fires an alert, two Critical alerts at the same time, one for Lateral Movement and one for PowerShell deleting Volume Shadow Copies.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*KuBWmQvVKbSXQ13ZvO8Ulw.png" /><figcaption>Two Critical Alerts Appear</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*N1-PBR0WatPQkEP0V3GXxQ.png" /><figcaption>Alert Detail for powershell.exe (Interactive Session c2e7)</figcaption></figure><p>The PowerShell alert shows Anti Exploitation / Fileless as the detection engine, executed under the luminousvl account, with the analysis explicitly flagging an attempt to delete all VSS shadow copies (T1490). Purple AI adds a process-correlation overview that speeds up triage.</p><p>The alert only fires in the final minutes, after initial access, C2, persistence, and lateral movement had already gone undetected. Teams relying solely on alerts would engage this incident far too late. Proactive hunting is what compresses dwell time here, and could have broken this chain well before the destructive stage.</p><p>Root cause confirmed that a command injection vulnerability in the internet-facing web app allowed arbitrary command execution from unvalidated input, leading to RCE and the implant being planted.</p><h3>Mitigation &amp; Response</h3><p>Response depends on business context. Cutting network access on a 24/7 production system isn’t a decision made lightly, but since the victim here is a landing page, there’s more room to act. Either way, one rule is non-negotiable that secure the evidence first, then contain. Rushing to remediate destroys the artifacts needed to understand the attack.</p><h4>1. Forensic Collection: Secure the Evidence First</h4><p>Before touching anything, I pull the full collection and evidence off the server, especially if it’s a system that deals with customers daily. SentinelOne’s Forensic Collection can be run straight from the console.</p><pre>Agent Management &gt; Click Endpoint &gt; Actions &gt; Endpoints &gt;<br>Forensics Collection &gt; Common Artifacts &gt; Run Collection &gt; Agent Tasks<br>Page &gt; Run &gt; Two-Factor Authentication &gt; Tasks &amp; Updates &gt; (select the<br>collection) &gt; Download File</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ji6KEqaFuU9MbxK72HaTqg.png" /><figcaption>Endpoint Page</figcaption></figure><p>Click Actions to retrieve Forensics Collection</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/869/1*20tYDDpcIOAxW049W-rXFg.png" /><figcaption>Forensic Collection Profile</figcaption></figure><p>Then click Run Collection to get Artifact.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/989/1*ITbOrPwlyruHTei2gYRMmw.png" /><figcaption>Tasks &amp; Updates</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/901/1*KAV1OZFz8sMMLKz42ypimA.png" /><figcaption>Common Artifacts Collection Detail</figcaption></figure><p>Once it’s extracted, I open the collection in a text editor. Two artifacts give immediate context. First, in <strong>NetworkPorts</strong>, the <strong>ss.txt</strong> file shows the server’s port 22 (SSH) is open to anyone (0.0.0.0:22).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*FriC1a3SZv_Tok1V4PzoiQ.png" /><figcaption>sshd LISTEN on 0.0.0.0:22</figcaption></figure><p>SSH bound to <strong>0.0.0.0:22</strong> is what made the lateral movement trivial. This isn’t a code bug, it’s a segmentation failure that an administrative service with no network ACL turns a single-host compromise into a network-wide one.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*3LUKXgFN1PL0lzydrA-9rQ.png" /><figcaption>bash history from the artefacts collection</figcaption></figure><p>The .bash_history reads like a linear attack log: <strong>find -iname “.txt”</strong> to hunt for secrets, read the operator notes, set up cron persistence, then pivot via SSH. The <strong>history -d 72</strong> at the end is an anti-forensics attempt, deleting one line to cover tracks. It’s futile here, since SentinelOne’s telemetry sits outside the attacker’s reach, which is exactly the case for centralized logging over host-local logs that can be tampered with.</p><h4>2. Deeper Investigation via Remote Shell</h4><blockquote><strong><em>Caution: </em></strong><em>Remote Shell should only be used after getting the server owner’s permission for forensic work. Access: Actions &gt; Endpoints &gt; RemoteShell.</em></blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*leoP6kzqkRrYeimyphNc-A.png" /><figcaption>remote shell on the apps directory</figcaption></figure><p><strong>ops_notes.txt</strong> is the pivot point between initial access and lateral movement. Plaintext workstation credentials on the web server gave the attacker a direct path to Windows, no exploitation required. Credential storage like this on an internet-facing host remains one of the costliest and most common mistakes in real breaches</p><p>Next, the dropped file, an ELF executable created at 22:22:23 on 3 Sept 2026 consistent with the attack timeline.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*xB7h4jescIamlB0fOBgnUw.png" /><figcaption>remote shell on the apps directory</figcaption></figure><h4>3. Network Containment</h4><p>Cutting network access on a 24/7 production system isn’t a unilateral call, it carries real business impact. For a landing page server like this one, though, temporary containment while the investigation continues is a reasonable move.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ji6KEqaFuU9MbxK72HaTqg.png" /><figcaption>Endpoint Pane</figcaption></figure><p>Click <strong>Actions</strong>, then choose <strong>Disconnect from Network.</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/870/1*WCeRgFzHBk39h8SjW7WZPA.png" /><figcaption>Disconnect from Network</figcaption></figure><p>I do the same for the Windows endpoint hit by lateral movement, so the attacker’s movement is cut off on both sides. Once it’s done, both endpoints show as Isolated.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*kMEbZPmIXa8WyY4okxBJqQ.png" /><figcaption>Agent Management</figcaption></figure><h3>Wrapping Up</h3><p>From an investigation that started entirely from hunting, not from an alert, I was able to rebuild the full attack chain:</p><p><strong>python3 (web app) -&gt; shell command-&gt; curl -&gt; C2 implant -&gt; C2 connection -&gt; crontab -&gt; reading the credential file -&gt; outbound SSH (lateral movement) -&gt; deleting shadow copies.</strong></p><p>Alerts are the last safety net, not the first. A capable attacker stays under the detection threshold, and the stages that matter most, initial access and lateral movement, are usually the quietest. Proactively querying the data is what shrinks dwell time and turns you from a reactive victim into a hunter.</p><h4>Attack Chain Summary</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*liOQthdbBLIbJmXoNbbVwg.png" /><figcaption>Attack Chain Summary</figcaption></figure><h4>Attack Scenario Topology</h4><p>Overall, the flow from the attacker to the web server and then to the employee workstation looks like this:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*7hQZSWNgefxL3E3BIgA5EA.png" /></figure><h4>Indicator of Compromise (IoC)</h4><p>A summary of the indicators from this investigation, ready to reuse for sweeping across other environments:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_Hx8aoh-lSSvGW67BOqbfg.png" /><figcaption>Table IOC</figcaption></figure><h3>Closing</h3><p>This investigation shows that with Event Search, Storyline, and Forensic Collection, a single analyst can trace a cross-platform compromise from scratch to the end, well before the detection engine speaks up. Compromise assessment isn’t really about fancy tooling, it’s about being persistent with your questions and patient enough to pull the thread one piece at a time.</p><p>In the next post, I’ll cover RemoteOps and how to build a fuller, more mature Forensic Collection so the DFIR process in SentinelOne can go even deeper.</p><p><em>See you in the next one guys. Reyhan Al Farel.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=88eeb1e1c2b0" width="1" height="1" alt=""><hr><p><a href="https://medium.com/fmisec/threat-hunting-compromise-assessment-in-sentinelone-singularity-platform-88eeb1e1c2b0">Threat Hunting &amp; Compromise Assessment in SentinelOne Singularity Platform</a> was originally published in <a href="https://medium.com/fmisec">FMI Cyber Security Consulting Services</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[SentinelOne Singularity Onboarding: Tenant Creation, Agent Deployment and a Lab Test]]></title>
            <link>https://medium.com/fmisec/sentinelone-singularity-onboarding-tenant-creation-agent-deployment-and-a-lab-test-1ec86f75e26c?source=rss----5aebc5961dd0---4</link>
            <guid isPermaLink="false">https://medium.com/p/1ec86f75e26c</guid>
            <category><![CDATA[sentinelone]]></category>
            <category><![CDATA[incident-response]]></category>
            <category><![CDATA[digital-forensics]]></category>
            <category><![CDATA[dfir]]></category>
            <category><![CDATA[blue-team]]></category>
            <dc:creator><![CDATA[Muhammad Aji Prasetyo]]></dc:creator>
            <pubDate>Thu, 24 Sep 2026 02:01:04 GMT</pubDate>
            <atom:updated>2026-09-24T02:01:03.299Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*fP4mivVRwcIQvLpnV1HDUQ.jpeg" /></figure><p>Onboarding a new customer into SentinelOne sounds simple enough. Create the tenant, set up the accounts, push the agent, move on. But there’s a question that doesn’t answer: if that endpoint actually got hit, would any of it work? You don’t really know until you test it.</p><p>So that’s what we did here. This walkthrough covers the full onboarding tenant creation, user provisioning, agent deployment and then goes one step further: we ran an test attack against the endpoint once it was live.</p><p>Not a real one. We used Atomic Red Team to simulate, Which gives you the same behavior a ransomware incident would like files getting mass-created, a ransom note dropped somewhere, PowerShell doing sketchy things. just without anything actually getting encrypted or spreading past the box.</p><p>If the platform picks it up end to end, that tells us the tenant’s configured right, the agent’s actually reporting, and the detection and response side of things works the way it’s supposed to.</p><h4><strong>Tenant (Account &amp; Site) Creation in SentinelOne</strong></h4><ol><li>Log in to the SentinelOne Management Console using a Global Admin/Admin account with permission to create a new tenant.</li><li>Open the scope panel using the (<strong>&gt;</strong>) control next to <strong>Global</strong>.</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/798/1*YlMZRNFcWLs0a3uPoifLQA.png" /></figure><p>3. Click the (+) icon to add a new site.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/808/1*Xm9oLjChrLeBS6esc6DXSw.png" /></figure><p>4. Since this tenant is being created for Incident Response purposes, select “IR” as the site type.</p><p>5. Enter the required site information, then click Next.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/652/1*IohEc56WE9_T2kEGIPc1pw.png" /></figure><p>6. For policy settings, inherit the Global Default Policy, or you can modify on you own policy.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/808/1*LVBqwETrKYLJAzyNk3YA-A.png" /></figure><p>7. after that you can click on Next and it will bring you to the summary and click on Create Site.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_xYW0AIdLeaamWPQjesvzg.png" /></figure><p>8. Generate and copy the Site Token. This token is required to install the agent on the target endpoint.</p><h4><strong>Customer User Account Creation</strong></h4><ol><li>Navigate to <strong>Policies and Settings &gt; User Management &gt; Console Users.</strong></li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/809/1*vXuU8c5y4qtlbMa2nOyCDw.png" /></figure><p>2. Click New User</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/811/1*qMWK8bSGEwkyXs3OfAR57g.png" /></figure><p>3. Enter the user’s email address and assign the user to the site/tenant created before.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/975/1*3mDjZK9Bq8d22E8SZyJFDg.png" /></figure><h4><strong>Agent Onboarding on the Suspected Compromised Endpoint</strong></h4><ol><li>Go to<strong> Agent Management</strong>, confirm you are in the correct site, then click Packages.</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1016/1*TfftxKqUlM_snMD14f2a8Q.png" /></figure><p>2. Search for a package compatible with the target endpoint. In this case, the affected device runs Windows 10, so an .msi/.exe package was selected via <strong>Package &gt; Action &gt; Download Package</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1016/1*d9QclD_dj3oO1D5wh3AFaQ.png" /></figure><p>3. Run the downloaded installer. It will prompt for the Site Token generated, paste it into the installer and click Next.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1016/1*ByjEhkAJ-UhBg3m4soA9cg.png" /></figure><p>4. The installer proceeds with agent installation.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1016/1*Z15Y_jKTphNYe5uQDozbeg.png" /></figure><p>5. Once installation completes, confirm the SentinelOne agent process is running in the background.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1016/1*yyjVE_-ZFaN1-6qPC6j0qw.png" /></figure><p>6. Return to<strong> Agent Management &gt; Endpoints</strong>. The newly onboarded desktop now appears in the endpoint list. Click the endpoint name to review its status.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1016/1*RMKVpxcZIrLMFqNMjbEc-A.png" /></figure><h4><strong>Lab Testing Incident Analysis &amp; Investigation</strong></h4><p>Two complementary test cases were used to exercise different SentinelOne detection engines: a reputation-based detection using a known malicious test file, and a behavioral simulation of ransomware activity using the Atomic Red Team framework.</p><h4><strong>1. Reputation-Based Detection</strong></h4><ul><li>Atomic Red Team was pre-installed on the endpoint before the SentinelOne agent was deployed. Shortly after the agent came online, multiple entries appeared under Unresolved Alerts.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1016/1*hUqqFRHIZQLmFKc9C_OHCg.png" /></figure><ul><li>Atomic Red Team was pre-installed on the endpoint before the SentinelOne agent was deployed. Shortly after the agent came online, multiple entries appeared under Unresolved Alerts.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/856/1*JAM2RVnadCDE_883fkU5TQ.png" /></figure><ul><li>The file located at<br><strong>\Device\HarddiskVolume3\AtomicRedTeam\atomics\T1221\src\Calculator.docx <br></strong>was identified as a Trojan by SentinelOne’s Cloud Intelligence Reputation engine as medium severity.</li><li><strong>Purple AI </strong>generated an automatic natural-language explanation of the detection, and the Mitigation Actions panel confirmed the process was Killed and the file Quarantined successfully.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1016/1*TtDjuGcXN29WdjJTzxQJdw.png" /></figure><h4>2. <strong>Behavioral Simulation, Atomic Red Team T1486, Atomic Test #10 (Akira Ransomware)</strong></h4><ul><li>To evaluate SentinelOne’s behavioral detection capability against ransomware-style activity, Atomic Test #10 (“Akira Ransomware drop files with .akira extension and ransomnote”) was executed from an elevated PowerShell session on the endpoint.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1016/1*41_E34pqTMzv9e23sVVIfw.png" /></figure><ul><li>Following execution, the endpoint’s local disk showed 100 newly created files with the .akira extension, along with a ransom note (akira_readme.txt) dropped on the Desktop.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/853/1*36t0vrFXvnFLgxccC1XwnA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/855/1*dwJA_LLYIZhLWgjmOdlCcA.png" /></figure><ul><li>Event Search (Deep Visibility) was used to query for PowerShell-related activity using the PowerQuery below:</li></ul><pre>| filter( src.process.displayName == &quot;Windows PowerShell&quot; )<br>| columns event.time, event.id, event.type, site.id, site.name, agent.uuid,<br>  timestamp, src.process.storyline.id, src.process.user, src.process.uid,<br>  src.process.cmdline, src.process.image.path, tgt.file.path, tgt.file.size,<br>  tgt.file.type, tgt.file.isSigned<br>| sort - timestamp<br>| limit 1000</pre><ul><li>The query returned 162 matching events. One entry of particular interest showed the command script <br><strong>echo “” &gt;&gt; $env:Userprofile\Desktop\akira_readme.txt</strong>, <br>executed by a signed <strong>powershell.exe</strong> process spawned from the legitimate RuntimeBroker.exe.</li><li>Purple AI flagged this activity as significant, reporting 105 file creations, 147 file modifications, and classifying the underlying indicators as 339 general, 76 ransomware-related, 33 evasion, 21 injection, 7 reconnaissance, and 1 exploitation indicator, with no associated network or DNS activity.</li></ul><h4><strong>Remote Remediation via Remote Shell</strong></h4><ul><li>Since this activity was a lab test rather than a genuine compromise, cleanup was performed directly from the console using SentinelOne’s Remote Shell capability (<strong>Endpoint &gt; Actions &gt; Response &gt; Remote Shell</strong>), avoiding the need for local or RDP access to the endpoint.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1016/1*2KCTHo5CrafZKXJhobLy1Q.png" /></figure><ul><li>Clicking <strong>Start Session </strong>prompted for a 2FA acting as a step-up verification before remote command execution is permitted.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1016/1*PiYAIQKLey-E50J_A3AoAw.png" /></figure><ul><li>Once connected, the following cleanup commands were attempted</li></ul><pre>del C:\Users\PC-Labs\Desktop\akira_readme.txt<br>del C:\test.*.akira</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1016/1*bTJ_az3_eFxjOhGZHtTwDQ.png" /></figure><ul><li>Cleanup was verified with the commands below; an empty result and a False return respectively confirmed no artifacts remained on disk.</li></ul><pre>Get-ChildItem C:\test.*.akira -ErrorAction SilentlyContinue<br>Test-Path &quot;C:\Users\&lt;username&gt;\Desktop\akira_readme.txt&quot;</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1016/1*zmx6FaAKT_kTw_QCLVLzIw.png" /></figure><h4><strong>Conclusion</strong></h4><p>This lab exercise successfully validated the end-to-end SentinelOne Singularity onboarding workflow, from tenant creation through agent deployment and initial incident investigation. The platform demonstrated strong, fully automated performance against a known-bad static threat, with detection, killing, and quarantine completed.</p><p>The behavioral ransomware simulation (Atomic Red Team T1486, Test #10) executed successfully and produced substantial forensic telemetry, which Purple AI was able to interpret and summarize meaningfully for an analyst a clear strength for investigation speed before they’re going into more deeper analysis.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=1ec86f75e26c" width="1" height="1" alt=""><hr><p><a href="https://medium.com/fmisec/sentinelone-singularity-onboarding-tenant-creation-agent-deployment-and-a-lab-test-1ec86f75e26c">SentinelOne Singularity Onboarding: Tenant Creation, Agent Deployment and a Lab Test</a> was originally published in <a href="https://medium.com/fmisec">FMI Cyber Security Consulting Services</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Collecting and Reviewing Endpoint Logs with SentinelOne, Before Going Deep]]></title>
            <link>https://medium.com/fmisec/collecting-and-reviewing-endpoint-logs-with-sentinelone-before-going-deep-c5d500d1beb3?source=rss----5aebc5961dd0---4</link>
            <guid isPermaLink="false">https://medium.com/p/c5d500d1beb3</guid>
            <category><![CDATA[blue-team]]></category>
            <category><![CDATA[sentinelone]]></category>
            <category><![CDATA[digital-forensics]]></category>
            <category><![CDATA[incident-response]]></category>
            <category><![CDATA[dfir]]></category>
            <dc:creator><![CDATA[Muhammad Aji Prasetyo]]></dc:creator>
            <pubDate>Mon, 21 Sep 2026 02:01:03 GMT</pubDate>
            <atom:updated>2026-09-21T02:01:03.383Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*bwty1ojBVDxV_Pvz2z7ptw.jpeg" /></figure><p>SentinelOne’s <strong>Fetch Logs</strong> action pulls exactly that: agent activity logs, plus a slice of the endpoint’s own Event Viewer logs, bundled into a downloadable package, no scripting required. It’s not a full forensic image, and it’s not meant to be. It’s the fast first pass that tells you whether you’re looking at noise or something that actually warrants isolating the host and reaching for the heavier tools.</p><p>In this article, we’ll walk through pulling logs from an endpoint, and what’s actually inside the package once you unzip it.</p><ol><li><strong>Collect the logs</strong></li></ol><p>You can access to the SentinelOne Console first after that you can go to the <strong>Inventory &gt; Endpoint</strong></p><ul><li>Select the Endpoint you want to collect the logs</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/975/1*J47LkdoTvIO1uwKfqM6G2g.png" /></figure><ul><li>Click on <strong>Actions &gt; Endpoint &gt; Troubleshooting &gt; Fetch Logs</strong></li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/975/1*2ZqiwdFUv-G1Z4Dzxpq4qg.png" /></figure><ul><li>It will pop up <strong>Fetch Logs</strong> options that you need to select the <strong>Agent Logs</strong> and <strong>Endpoint Logs </strong>after that you can click on <strong>Fetch Logs</strong></li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/975/1*iNIweyc585C3DJuOFVWnZA.png" /></figure><p><strong>2. Download the collected logs</strong></p><p>After you fetch the logs, you must be wondering. Where can I download it? Because after you click the Fetch logs, there is no pop up again or even the logs is not directly downloaded.</p><ul><li>After you click on the <strong>Fetch logs </strong>you may need to wait 1–5 minutes until the logs is fully fetched, to check. You can go to the <strong>Activities </strong>tab menu on your left.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/975/1*KmHq_CIV8izsGK_KL5CHmg.png" /></figure><ul><li>Now if you already see the <strong>Download File</strong>, you can click it and download the <strong>fetched logs</strong></li><li>The file is successfully downloaded.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/588/1*mynxyZxpsUWFgu6heGtn1g.png" /></figure><p><strong>3. Download the collected logs</strong></p><p>After you download and extract the files, you can see a lot of files in it</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/975/1*szMdyAoisXyNj_ZbQ71oqQ.png" /></figure><ul><li>Scan_report.txt</li></ul><p>Contains information about summary of the last scan: files scanned, and any malicious detections found</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/975/1*8YG-OmJerj6iTlTWfAmMAQ.png" /></figure><p>For example, on this logs we found out a lot of Malicous files because this endpoint is tested as a labs and installed with a lot of script from the Atomic Red Team.</p><ul><li>LastScanReport.logs</li></ul><p>Verbose scan engine log (mostly “file locked, skipped” noise or not detections)</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/975/1*cc9oQbZqoYlzGIdscuX4DA.png" /></figure><ul><li>FullActivityAnalyzerReport.txt</li></ul><p>This file contains information about the SentinelOne Agent activity used to troubleshoot interoperability or performance problems that might be related to SentinelOne Agent conflict with other applications.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/975/1*uWPWNrAL8vxHk0bzvL7GvA.png" /></figure><ul><li>PlatformLogs\EventViewer Folder: Includes key logs like:<br>- Application<br>- System<br>- Security<br>- Hardware Event<br>- Kernel Event<br>- Plus SentinelOne’s own event channels again</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/975/1*G6Ccve0i1n_9EUINAZAxEw.png" /></figure><ul><li>PlatformLogs\Misc Folder</li></ul><p>This Misc Folder have a lot of information that you can see through.</p><ul><li>NetStat-All.txt : contains active connections</li><li>DnsCache.txt : resolver cache</li><li>VssLog.txt : shadow copy status</li><li>AllApps.txt : installed software</li><li>LoadedModules.txt : per-process loaded modules</li><li>AdvFirewall.txt : firewall rule export</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/975/1*ElHcRYpdpC6o60H2X3PsgQ.png" /></figure><p><strong>Conclusion and Final Thoughts</strong></p><p>Fetch Logs isn’t a full forensic collection, and it was never meant to be one. What it gives you is the answer to the one question that actually matters at the start of triage. This step is easy to skip, especially when an alert fires and the instinct is to go straight for the bigger tools. A five-minute log pull is usually enough to tell you which pile something belongs in before you jump it to the bigger tools to check more deeper.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c5d500d1beb3" width="1" height="1" alt=""><hr><p><a href="https://medium.com/fmisec/collecting-and-reviewing-endpoint-logs-with-sentinelone-before-going-deep-c5d500d1beb3">Collecting and Reviewing Endpoint Logs with SentinelOne, Before Going Deep</a> was originally published in <a href="https://medium.com/fmisec">FMI Cyber Security Consulting Services</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Hunting the Evil : A Practical Guide to Linux Threat Hunting — Part 3]]></title>
            <link>https://medium.com/fmisec/hunting-the-evil-a-practical-guide-to-linux-threat-hunting-part-3-a7a028ebde01?source=rss----5aebc5961dd0---4</link>
            <guid isPermaLink="false">https://medium.com/p/a7a028ebde01</guid>
            <category><![CDATA[threat-hunting]]></category>
            <category><![CDATA[linux-threat-hunting]]></category>
            <category><![CDATA[dfir]]></category>
            <category><![CDATA[linux-dfir]]></category>
            <category><![CDATA[blue-team]]></category>
            <dc:creator><![CDATA[Digit Oktavianto]]></dc:creator>
            <pubDate>Thu, 03 Sep 2026 02:01:04 GMT</pubDate>
            <atom:updated>2026-09-03T02:01:04.121Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ave2P2hpEh-rAHBaCHFhjA.jpeg" /><figcaption>Image Generated by Gemini AI</figcaption></figure><p>One more welcome back.</p><p>Part 1 gave you <strong>six single-host artifact categories</strong>. Part 2 took you past where the classic checklist stops — <strong>auditd, kernel-module and eBPF rootkits, containers and Kubernetes, cloud credential theft, supply chain compromise, file integrity baselines, timestomping, memory forensics, and hunting at fleet scale</strong> — and closed with a five-step methodology: baseline, hypothesis, collect, analyze, repeat.</p><p>That methodology is only as good as the hypotheses you feed it, though. Knowing the artifacts is necessary but not sufficient — the actual skill in threat hunting is generating a hypothesis worth chasing and knowing which artifacts answer it.</p><p>So that’s where Part 3 picks up: <strong>eight worked scenarios</strong>, in the same hypothesis → artifacts → pivot shape as the backdoor-user example from Part 2, covering everything from cryptomining to ransomware staging to living-off-the-land exfiltration.</p><p>After that, we will talk about why attackers do what they do, how to avoid drowning your on-call team in false positives, and close out the series with the checklist and challenge that ties all three parts together.</p><p>Let’s finish this.</p><h3>Worked Hypotheses: Eight Scenarios to Practice On</h3><p>The backdoor-user hypothesis above is a great starting example, but the real skill here is generating and chasing <em>many</em> hypotheses. Here are eight more, in the same hypothesis → artifacts → pivot format, drawn from the artifact categories above.</p><p><strong>1. Cryptomining infection.</strong> Hypothesis: “This server’s CPU usage spiked, and I think it’s mining cryptocurrency.” Artifacts: the process list for miner signatures (xmrig, minerd, or simply an unexplained high-CPU process with a masqueraded name), outbound connections to known mining-pool ports (3333, 4444, 5555, 14444), and cron or systemd-timer entries that silently relaunch the miner if it&#39;s killed. Recent real-world campaigns have specifically used tampered PAM modules to hide XMRig activity from process listings — so this scenario is a natural pivot back into the persistence section above.</p><p><strong>2. Web shell on an internet-facing application.</strong> Hypothesis: “I think this web server has been compromised through the application, not SSH.” Artifacts: access logs for POST requests to unusual .php/.jsp/.aspx paths returning 200, recently modified files inside the webroot, files containing functions like eval, base64_decode, system, or exec that don&#39;t match the application&#39;s known codebase, and — critically — a process tree showing the web server&#39;s own user (www-data, apache) spawning a shell, which should never happen in a healthy application.</p><p><strong>3. Container escape / privileged container abuse.</strong> Hypothesis: “A container on this host may have broken out to the underlying host.” Artifacts: unexpected host-level processes owned by the container runtime’s UID, docker.sock mounted inside a container, host paths mounted read-write inside a container that shouldn&#39;t need them, and new host-level cron or systemd entries created immediately after a suspicious container was scheduled.</p><p><strong>4. Cloud credential theft via SSRF.</strong> Hypothesis: “The app on this instance has an SSRF vulnerability, and I think credentials were stolen from the metadata service.” Artifacts: application logs showing requests to 169.254.169.254, cloud audit logs showing API calls from that instance&#39;s role originating from an unfamiliar source IP, and IAM actions being called that the application itself would never need.</p><p><strong>5. Supply chain compromise via CI/CD.</strong> Hypothesis: “A build pipeline on this box pulled in a malicious dependency.” Artifacts: pip/npm/gem install logs for unfamiliar or typosquatted package names, curl | bash patterns in build scripts, outbound connections initiated during a build step rather than at runtime, and modified lockfiles that don&#39;t match version control.</p><p><strong>6. Ransomware staging (pre-encryption).</strong> Hypothesis: “I think this host is being staged for a ransomware deployment, not already encrypted.” Artifacts: mass file enumeration activity, tampering with backup services (checking whether backup agents or snapshot schedules were recently disabled), and an unusual volume of outbound traffic — staging for double-extortion exfiltration — shortly before any encryption activity begins. Worth calling out on its own: a lot of Linux ransomware specifically targets ESXi hosts and NAS appliances rather than general-purpose servers, so if you run either, they deserve their own dedicated hunt.</p><p><strong>7. Lateral movement via SSH key reuse.</strong> Hypothesis: “The attacker moved from this host to others using stolen SSH credentials.” Artifacts: known_hosts entries for systems the account owner wouldn&#39;t normally reach, authorized_keys additions on destination hosts matching a key first seen on the origin host, and correlating wtmp login timestamps across multiple hosts to reconstruct the pivot path.</p><p><strong>8. Living-off-the-land data staging and exfiltration.</strong> Hypothesis: “Data was collected and staged for exfiltration using built-in tools, not custom malware.” Artifacts: large tar/zip/gzip archives appearing in /tmp or /var/tmp shortly before a large outbound transfer, curl/wget/scp invocations with unusual destinations in shell history, and — for cases where outbound HTTP is blocked but DNS isn&#39;t — DNS- or ICMP-based exfiltration channels.</p><h3>The “Why” Matters</h3><p>Here’s something I’ve learned from years of hunting: attackers have patterns.</p><ul><li>They want credentials → they’ll check /etc/shadow, memory, bash history</li><li>They want persistence → they’ll modify cron, systemd timers, PAM, or ld.so.preload, or add SSH keys</li><li>They want to move laterally → they’ll SSH to other systems, leaving traces in known_hosts and shell history</li><li>They want to exfiltrate → they’ll create archives, which show up in filesystem listings, or lean on DNS tunneling when the front door is watched</li></ul><p>When you understand why attackers do what they do, you know where to look.</p><h3>A Note on False Positives</h3><p>Everything above will occasionally point at something completely innocent, and it’s worth naming that plainly rather than letting new hunters get burned by it. A new sysadmin account, a legitimate cron job dropped by Ansible or Puppet, and normal known_hosts growth from a jump host all look identical to attacker activity at first glance. This is exactly why Step 1 — establishing a real baseline from golden images, config management state, and your asset inventory — isn&#39;t optional scaffolding. It&#39;s the difference between a hunt that finds evil and a hunt that just generates noise for the on-call team.</p><h3>Your Hunting Checklist</h3><p>Before you start your next Linux hunt, here’s a quick cheat sheet based on the SANS FOR577 poster (which lives on my wall, by the way). FOR577 is SANS’s dedicated course on <strong>Linux Incident Response and Threat Hunting</strong>, and the poster distills a huge amount of that curriculum into something you can glance at mid-hunt.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/700/1*FABlcOIexjVG_LXOJxY_6g.png" /><figcaption>SANS FOR577 Poster of Linux Artifacts for DFIR and Hunting</figcaption></figure><h3>The Challenge</h3><p>Here’s my challenge to you: pick one Linux system this week and hunt it.</p><p>Not a critical production server. Maybe a test box. Maybe a container. Just pick something and go through the checklist.</p><p>Look at the user accounts. Check the cron jobs and systemd timers. Examine the shell history. Check /etc/ld.so.preload. See what&#39;s listening on the network. If it&#39;s a container host, check for docker.sock exposure while you&#39;re at it.</p><p>You might find nothing. That’s fine — now you have a baseline.</p><p>Or you might find something weird. And that weird thing? That’s where the fun begins.</p><p>Because the artifacts are there. They’re always there. You just need to know where to look.</p><h3>One Last Thing</h3><p>Three parts and roughly two dozen artifact categories ago, I told you I used to be terrified of Linux DFIR and hunting. I’m not anymore, and if you’ve made it this far, I’d bet you’re a lot less terrified than when you started Part 1 too.</p><p>That’s really the whole point of this series. Not to hand you a checklist to run once and file away, but to build the instinct — the artifact mindset — so that the next time someone asks “could this box be compromised?” you don’t feel that old pass-on-Linux dread. You open a terminal instead.</p><p>If you run this against a real system and find something, I’d genuinely like to hear about it — drop it in the comments. If you find nothing, that’s a win too; you just built a baseline you can trust next time something looks off.</p><p>Go hunt something.</p><p>Long Live Cyber Defender!!!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a7a028ebde01" width="1" height="1" alt=""><hr><p><a href="https://medium.com/fmisec/hunting-the-evil-a-practical-guide-to-linux-threat-hunting-part-3-a7a028ebde01">Hunting the Evil : A Practical Guide to Linux Threat Hunting — Part 3</a> was originally published in <a href="https://medium.com/fmisec">FMI Cyber Security Consulting Services</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Turning Linux Host Data into Forensic Evidence with UAC (Unix-like Artifact Collector) and DFIR…]]></title>
            <link>https://medium.com/fmisec/turning-linux-host-data-into-forensic-evidence-with-uac-unix-like-artifact-collector-and-dfir-fb5a3a4dbfb3?source=rss----5aebc5961dd0---4</link>
            <guid isPermaLink="false">https://medium.com/p/fb5a3a4dbfb3</guid>
            <category><![CDATA[linux]]></category>
            <category><![CDATA[linux-forensics]]></category>
            <category><![CDATA[digital-forensics]]></category>
            <category><![CDATA[linux-dfir]]></category>
            <category><![CDATA[blue-team]]></category>
            <dc:creator><![CDATA[Christopher Ryan]]></dc:creator>
            <pubDate>Wed, 02 Sep 2026 02:01:02 GMT</pubDate>
            <atom:updated>2026-09-02T02:01:02.188Z</atom:updated>
            <content:encoded><![CDATA[<h3>Turning Linux Host Data into Forensic Evidence with UAC (Unix-like Artifact Collector) and DFIR Companion</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*3dbQ1VOOXyZ_N2po3ja6Qw.png" /></figure><p>When investigating a compromised Linux machine, the first challenge is usually not a lack of evidence.</p><p>It is the opposite.</p><p>A single server can generate thousands of log entries, authentication records, audit events, service messages, and other traces of activity. Buried somewhere inside that data may be the evidence needed to understand what happened.</p><p>The problem is figuring out where to start.</p><p>Instead of manually collecting individual files from a Linux host, this walkthrough uses <strong>UAC </strong>(Unix-like Artifact Collector) to gather a structured collection of forensic artifacts and then brings the relevant evidence into <strong>DFIR Companion</strong> for further examination.</p><p>The goal is simple:</p><p><strong>Collect first. Organize the evidence. Correlate the activity. Then investigate.</strong></p><h3>Why Collecting Linux Evidence Matters</h3><p>A Linux system leaves behind traces of activity in many different places.</p><p>Authentication attempts may appear in authentication logs. System events can be recorded by syslog, while Linux auditing can provide another layer of visibility through audit.log. Individual applications and services may also maintain their own records.</p><p>Looking at only one source can therefore give an incomplete picture.</p><p>For example, an authentication event might not immediately look suspicious. But if that event is followed by an unusual command, a new process, or another related system event, the overall sequence may tell a very different story.</p><p>That is why the first stage of an investigation is making sure the evidence is collected in a way that allows those relationships to be examined later.</p><h3>Preparing UAC</h3><p>For this investigation, I used <strong>UAC (Unix-like Artifact Collector)</strong> to acquire artifacts from the Linux host.</p><p>The version used in this walkthrough is UAC 3.3.0.</p><p>The archive can be downloaded directly from the UAC release:</p><pre>curl -L https://github.com/tclahr/uac/releases/download/v3.3.0/uac-3.3.0.tar.gz -o uac3.3.0.tar.gz</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/905/1*ku_I01OhBUUzhyMCDeqwZg.png" /></figure><p>After downloading the archive, extract it:</p><pre>tar -zxvf uac-3.3.0.tar.gz</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/509/1*_3X89QadNubSFtNrUSuHqw.png" /></figure><p>Then enter the extracted directory:</p><pre>cd uac-3.3.0</pre><p>At this stage, the collector is ready to be executed.</p><h3>Building the Evidence Collection</h3><p>UAC provides different collection profiles. For this walkthrough, the <strong>full profile</strong> is used to obtain a broad collection of artifacts from the host.</p><p>Run the collector with elevated privileges:</p><pre>sudo ./uac -p full &lt;path&gt;</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/846/1*FNJGAARv6mDktU66yX8g8A.png" /></figure><p>The &lt;path&gt; should be replaced with the location where you want the collected evidence to be stored.</p><p>Using elevated privileges is important because some system artifacts are not accessible to a normal user.</p><p>Once UAC finishes, the resulting collection is packaged into a compressed archive, accompanied by a log describing the collection process.</p><p>This archive is what we will take into the analysis environment.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/864/1*TfJPWDGzqbhkchCkhMAIkA.png" /></figure><h3>Moving from Acquisition to Analysis</h3><p>After the collection has completed, transfer the generated archive to the machine where the forensic analysis will be performed.</p><p>Once it arrives, extract the archive.</p><p>The extracted directory represents the evidence gathered from the Linux host.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/975/1*-2ow9H-wfczHKDWGVJJa9w.png" /></figure><p>This is an important point in the workflow: <strong>the original host is the source of evidence, while the analysis environment is where we examine it.</strong></p><p>Keeping these stages separate makes the investigation easier to manage and reduces the need to repeatedly interact with the original system.</p><h3>Setting Up the Investigation in DFIR Companion</h3><p>With the UAC collection available, the next stage is to create an investigation in DFIR Companion.</p><p>Start by creating a new case using this button below.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/975/1*8-GW0bISmwqcqLfi70AIfQ.png" /></figure><p>The case should contain the basic investigation information, including:</p><ul><li>Case ID</li><li>Case name</li><li>Investigator</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/954/1*QJ5uERHKGFS6VM1I4kz6Qg.png" /></figure><p>These details provide the investigation with an identifiable context before any artifacts are imported.</p><p>Then turn the AI analysis feature on</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/975/1*a5uX8sddNTrPVujUmL7hCg.png" /></figure><h3>Giving DFIR Companion the Evidence</h3><p>DFIR Companion provides an artifact-import function that allows the collected evidence to be added to the case, by using this button.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/975/1*RJZNGGXYrtR5qLyc_PZ6-g.png" /></figure><p>However, there is an important consideration before uploading anything:</p><p><strong>Do not assume that uploading more artifacts will automatically improve the investigation.</strong></p><p>A large collection can contain useful information, but it can also contain a significant amount of irrelevant data.</p><p>The better approach is to understand the incident first and then select artifacts that can help answer the investigation questions.</p><p>For a Linux server, examples of potentially relevant evidence include:</p><ul><li>audit.log</li><li>auth.log</li><li>Service-specific logs</li><li>Other logs generated by applications running on the host</li></ul><p>The exact selection depends on what is being investigated.</p><p>For example, an investigation involving suspicious login activity would naturally place more emphasis on authentication-related evidence. An investigation involving a particular service would require greater attention to that service’s logs.</p><p>The point is not to collect everything simply because it is available.</p><p>The point is to collect <strong>evidence that can help explain the event</strong>.</p><h3>Letting the Evidence Process</h3><p>Once the relevant artifacts have been imported, DFIR Companion processes the evidence.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/588/1*iN78ZoVBvW8RCSH1XXHO8g.png" /></figure><p>At this stage, the tool can analyze the available artifacts and produce findings that can help direct the investigation.</p><p>Rather than manually reviewing every piece of collected data from beginning to end, the generated results provide a starting point for identifying events that deserve closer attention.</p><p>After processing has finished, the investigation can be explored through the available dashboard views.</p><h3>Reviewing the Investigation Dashboard</h3><p>After the artifacts have been processed, DFIR Companion presents the investigation through a centralized dashboard.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*CgobEgdVL5RB7o8lZJdHoQ.png" /></figure><p>The dashboard separates the investigation into two main areas.</p><p><strong>Active Leads</strong> highlights findings that currently need attention. In this case, it points to issues such as a MongoDB instance running without access control and an external SSH login followed by privilege escalation to root.</p><p><strong>Since Your Last Review</strong> provides a quick view of newly updated findings and changes in severity, making it easier to spot developments that may require further investigation.</p><p>This dashboard gives the analyst a quick overview of the most important findings before diving deeper into the underlying evidence.</p><h3>Exporting the Investigation Results</h3><p>Once the analysis has been completed, the results can be exported for further use.</p><p>DFIR Companion can provide investigation outputs such as:</p><ul><li>Forensic reports</li><li>IOC blocklists</li><li>Forensic timelines</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/455/1*WffruMImMFdwuEnLjoBfRg.png" /></figure><p>These outputs can be useful for documenting the investigation and communicating the results to other analysts or incident responders.</p><p>However, exported results should still be reviewed before being treated as the final forensic record.</p><p>Below are the result of the report</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*W33zKohWXuVd5cUzTrtZHg.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_RbWwsV5I8vDpILkpQlZjg.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*jzyd-bjbefjpdligz5urrA.png" /></figure><h3>Final Thoughts</h3><p>Linux forensic investigations can quickly become difficult when evidence is scattered across different logs and system sources.</p><p>A collection tool such as UAC can simplify the acquisition stage by gathering a broad set of artifacts from the host. Once that evidence has been transferred to an analysis environment, DFIR Companion can help turn the collected data into findings, timelines, attack mappings, and indicators that are easier to investigate.</p><p>But the most important part of the workflow is not the automation.</p><p>It is <strong>correlation</strong>.</p><p>A single event rarely explains an incident by itself. Its significance often becomes apparent only after it is connected with other activity occurring around the same time.</p><p>That is why a good forensic workflow should not be:</p><p><strong>Collect everything → upload everything → trust the findings.</strong></p><p>Instead, it should be:</p><p><strong>Collect → select → correlate → investigate → validate.</strong></p><p>UAC provides the evidence foundation. DFIR Companion helps organize and analyze that evidence. The investigator provides the context and makes the final determination.</p><p>And ultimately, that is what forensic investigation is about — not simply finding suspicious artifacts, but building an evidence-supported explanation of <strong>what happened, when it happened, and why the evidence supports that conclusion.</strong></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=fb5a3a4dbfb3" width="1" height="1" alt=""><hr><p><a href="https://medium.com/fmisec/turning-linux-host-data-into-forensic-evidence-with-uac-unix-like-artifact-collector-and-dfir-fb5a3a4dbfb3">Turning Linux Host Data into Forensic Evidence with UAC (Unix-like Artifact Collector) and DFIR…</a> was originally published in <a href="https://medium.com/fmisec">FMI Cyber Security Consulting Services</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[From KAPE to DFIR Companion: A Practical Windows Forensic Investigation Workflow]]></title>
            <link>https://medium.com/fmisec/from-kape-to-dfir-companion-a-practical-windows-forensic-investigation-workflow-fbe276dcf8b9?source=rss----5aebc5961dd0---4</link>
            <guid isPermaLink="false">https://medium.com/p/fbe276dcf8b9</guid>
            <category><![CDATA[digital-forensics]]></category>
            <category><![CDATA[kape]]></category>
            <category><![CDATA[blue-team]]></category>
            <category><![CDATA[incident-response]]></category>
            <category><![CDATA[dfir]]></category>
            <dc:creator><![CDATA[Christopher Ryan]]></dc:creator>
            <pubDate>Thu, 27 Aug 2026 04:01:01 GMT</pubDate>
            <atom:updated>2026-08-27T04:01:01.875Z</atom:updated>
            <content:encoded><![CDATA[<p>Digital forensics often starts with a simple problem: there is too much evidence.</p><p>A compromised Windows machine can contain thousands of files, event logs, registry artifacts, Prefetch files, application logs, and other traces of attacker activity. Collecting everything is usually unnecessary. The real challenge is collecting the right evidence, processing it into a useful format, and then connecting the different artifacts together.</p><p>In this tutorial, I will show a practical workflow using <strong>KAPE and DFIR Companion</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*lXyljmgB0xpegim_EOUxQw.png" /></figure><p>The workflow to collect and investigate is:</p><p><strong>Windows Host → KAPE Collection → KAPE Modules → Parsed Artifacts → DFIR Companion → Investigation</strong></p><p>The goal is not to let AI replace forensic analysis. Instead, DFIR Companion can help correlate fragmented artifacts and make the investigation easier to understand.</p><h3>1. Collect Evidence with KAPE</h3><p>In evidence collection KAPE is very useful, because it allows us to quickly collect forensic artifacts from a Windows system without manually searching through the entire filesystem.</p><p>Place KAPE on the system that will perform the collection.</p><p>Open:</p><p>gkape.exe</p><p>This launches KAPE’s graphical interface.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/966/1*IkInFXXonexbxYncBmhwcQ.png" /></figure><p>Enable:</p><p><strong>Use Target Options</strong></p><p>This allows us to select the KAPE targets that should be collected.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/975/1*14UmiF67N89tUl1ZgawQ7Q.png" /></figure><h3>2. Select the Evidence Source</h3><p>For this investigation, the source is the Windows system partition:</p><p>C:\</p><p>The destination is the location where KAPE will store the collected evidence. I normally recommend keeping the collected evidence separate from the original source. Also, keep <strong>Flush</strong> disabled unless there is a specific reason to overwrite the destination. I also use %d in the output filename so the collection date is included automatically.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/739/1*cZR8GgSnBoy-JsWEwnoFyA.png" /></figure><h3>3. Choose the KAPE Targets</h3><p>There is no single KAPE target configuration that is perfect for every investigation.</p><p>The targets should depend on the incident.</p><p>For this experiment, I used:</p><ul><li>!BasicCollection</li><li>Prefetch</li></ul><p>The Basic Collection gives us several important evidence sources, including filesystem data, logs, registry hives, and other common forensic artifacts.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/721/1*0nSzOcLqjHbFFMm3FF1f4g.png" /></figure><p>Prefetch is collected separately because it can provide useful evidence about program execution.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/728/1*kecQnNLPijcZCz-9iyb4VA.png" /></figure><p>I also used a custom KAPE target for XAMPP logs because those logs were important to the web-server portion of the investigation.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/731/1*Zj0030u8LP9WBvRpjHPJAw.png" /></figure><p>This is an important KAPE feature:</p><p><strong>If the evidence you need is not included in an existing target, create your own target.</strong></p><p>For example, if the investigation involves XAMPP, Apache, PHP, or another application, its logs may be worth collecting even if they are not part of your normal collection profile.</p><h3>4. Run the KAPE Collection</h3><p>Save it as Zip file</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/613/1*bjZxqqCIl3Ss3jTidHzvZw.png" /></figure><p>Then execute the collection.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/975/1*jjT-oXTO192tBOMzcIPXvQ.png" /></figure><p>KAPE will collect the selected artifacts and create the forensic dump.</p><p>Depending on the amount of data collected and the speed of the system, this can take some time.</p><p>The result is your KAPE evidence set in the zip file.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/975/1*LFI5bAjvCVywJgJy7-4xbQ.png" /></figure><h3>5. Parse the KAPE Evidence</h3><p>The KAPE collection we did before contains the original forensic artifacts.</p><p>Some of those artifacts are already human-readable, but many are much easier to analyze after processing. This is where <strong>KAPE Modules</strong> become useful.</p><p>Move the KAPE dump to the analysis machine.</p><p>Open KAPE again and enable:</p><p><strong>KAPE Modules</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/975/1*RPQ_ZGp-KOqusUjZUN3L3g.png" /></figure><p>The module source should point to the KAPE dump that was just collected. The module destination is where the processed results will be stored. Again, I keep <strong>Flush</strong> disabled and use %d in the output filename.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/975/1*fklJ8uTHoJhfQcTN4wtmsQ.png" /></figure><h3>6. Run the Appropriate KAPE Module</h3><p>The module you choose depends on the investigation.</p><p>For this experiment, I used:</p><p>!EZParser</p><p>This module processes many Windows forensic artifacts using Eric Zimmerman’s forensic tools.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/720/1*J4V-UNEFgzK4QmFtJ55__Q.png" /></figure><p>Click <strong>Execute</strong> and allow KAPE to process the evidence.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/342/1*_heWVZMGG5w146t1D_SpoQ.png" /></figure><p>The result is a collection of parsed forensic data.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/975/1*wAuaYnf3K_1ZR5tMcadWxw.png" /></figure><p>A large portion of the output is available in formats such as CSV, which makes it much easier to search, filter, and analyze.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/975/1*GAy5Z-XQYybKfR8oy4MY_A.png" /></figure><p>However, there is an important limitation.</p><blockquote><strong>Parsed output is not the same thing as the original evidence. Not every artifact will necessarily be parsed.</strong></blockquote><p>The original evidence should always be preserved and reviewed when necessary.</p><p>Think of the workflow like this:</p><p>Original Evidence → Parsed Evidence → Investigation</p><p>The parsed files make analysis easier, but they should not replace the original forensic artifacts.</p><h3>7. Do Not Upload Everything to DFIR Companion</h3><p>This is probably the most important practical lesson from this workflow.</p><p>It is tempting to take the entire KAPE output and upload everything into DFIR Companion.</p><p>More evidence does <strong>not</strong> automatically mean a better investigation.</p><p>Too many unrelated artifacts can add noise and make correlation harder.</p><p>Instead, select artifacts based on the question you are trying to answer.</p><p>For example:</p><p>What executed? <br><strong>Check Prefetch, process creation logs</strong></p><p>What files were accessed? <br><strong>Check Filesystem artifacts, application logs</strong></p><p>For this experiment, I selected:</p><ul><li>Prefetch</li><li>Apache access logs</li></ul><p>These artifacts were chosen because the incident related to remote code execution from a web.</p><h3>8. Create New Case in DFIR Companion</h3><p>Create new case of analysis by pressing this button in the DFIR Companion console.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/975/1*8-GW0bISmwqcqLfi70AIfQ.png" /></figure><p>Enter the data needed like Case ID, Case Name and Investigator in the pop up.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/925/1*zMoqsNaMky01Lp87CTb3_g.png" /></figure><h3>9. Import the Evidence into DFIR Companion</h3><p>Now we can move to DFIR Companion.</p><p>Enable the AI analysis feature. Here</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/975/1*a5uX8sddNTrPVujUmL7hCg.png" /></figure><p>The purpose of this feature is to allow DFIR Companion to analyze the artifacts we provide and correlate information between them.</p><p>Use the artifact upload function to import the evidence.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/975/1*RJZNGGXYrtR5qLyc_PZ6-g.png" /></figure><p>Select the parsed artifact that you want the AI to analyze</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/936/1*Vq2xgYIO-Nspjschajyx8A.png" /></figure><blockquote>The DFIR Companion also able to analyze <strong>some unparsed </strong>log such as <strong>.eml .json .csv .txt and .text</strong>. So that other evidence file like .evtx .pcap image file need to be parsed to relevant input</blockquote><p>For apache access log its acceptable by the DFIR Companion because its in text format.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/922/1*kXwdU5NDKKp2KPaM9eW37A.png" /></figure><h3>10. Assign Severity</h3><p>After importing an artifact, DFIR Companion asks for a severity level.</p><p>In this experiment, the tools used to generate the artifacts did not provide a severity score.</p><p>Therefore, Info can be used when there is no better classification available.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/919/1*thj-6I3mjYxVo_UrNyJvFQ.png" /></figure><p>Severity should not be confused with proof of malicious activity.</p><p>A forensic artifact can be useful even when it is classified as informational.</p><p>For example, a Prefetch entry may not be malicious by itself, but it can become important when correlated with:</p><ul><li>a suspicious process</li><li>an unusual command</li><li>a web request</li><li>a file-access event</li></ul><p>That correlation is where the investigation becomes interesting.</p><p>Wait for the artifact to be imported and analyzed.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/457/1*YHmB4AM3yvuXBPtz1zSCMg.png" /></figure><h3>11. Choosing The Right Dashboard</h3><p>When everything is done, we can change the dashboard template by changing the type of the dashboard.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*nt1BCqwBdNsbBn3UfBV_mA.png" /></figure><p>For example we can choose the<strong> Triage view</strong> to see the findings alerted by DFIR Companion and the timeline.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*lSOyp7g5GIVTMYuhqpLY4g.png" /><figcaption>Findings</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*bI-R3wNq6qZH23VWDgwt9A.png" /><figcaption>Timeline</figcaption></figure><p>Through <strong>analyst dashboard </strong>view we can see the attack mapping and the IoCs marked</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Vy4_B_26Mu3_8FJRnCvKIg.png" /><figcaption>Kill Chain</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*AMN6uLFUO6e_KqyvrLFm3Q.png" /><figcaption>IoCs</figcaption></figure><h3>12. Report and Presentation</h3><p>The tool also provide us with the presentation feature</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*K1ktd20NitjpbfCRyeiHjA.png" /></figure><p>The contents of the presentation slide are the summary and detailed findings found by the tool.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*AZ8uelRNbXhusdwv7nzUGw.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*tYODt7p86DVmkgmWS-rlDA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*54SwjEF1zgk12k56sAhS5A.png" /></figure><p>After analyzing the artifacts, DFIR Companion provides export functions for generating outputs such as forensic reports, IOC blocklists, forensic timelines, etc</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*MompAaQ7lOIof0pK7wbV9A.png" /></figure><h3>Conclusion and Final Thoughts</h3><p>This workflow shows how <strong>KAPE and DFIR Companion can complement each other in a Windows forensic investigation</strong>. KAPE handles evidence collection and parsing, while DFIR Companion helps analyze and correlate the selected artifacts through findings, timelines, attack mapping, and IoCs.</p><p>The key is to collect and provide <strong>relevant evidence</strong>, rather than simply uploading everything. DFIR Companion can also export investigation results such as forensic reports, IOC blocklists, and forensic timelines. However, the generated findings should still be validated against the original evidence before being used as final forensic conclusions.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=fbe276dcf8b9" width="1" height="1" alt=""><hr><p><a href="https://medium.com/fmisec/from-kape-to-dfir-companion-a-practical-windows-forensic-investigation-workflow-fbe276dcf8b9">From KAPE to DFIR Companion: A Practical Windows Forensic Investigation Workflow</a> was originally published in <a href="https://medium.com/fmisec">FMI Cyber Security Consulting Services</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Hunting the Evil : A Practical Guide to Linux Threat Hunting — Part 2]]></title>
            <link>https://medium.com/fmisec/hunting-the-evil-a-practical-guide-to-linux-threat-hunting-part-2-674392b1de71?source=rss----5aebc5961dd0---4</link>
            <guid isPermaLink="false">https://medium.com/p/674392b1de71</guid>
            <category><![CDATA[blue-team]]></category>
            <category><![CDATA[linux-dfir]]></category>
            <category><![CDATA[dfir]]></category>
            <category><![CDATA[threat-hunting]]></category>
            <category><![CDATA[linux-threat-hunting]]></category>
            <dc:creator><![CDATA[Digit Oktavianto]]></dc:creator>
            <pubDate>Thu, 27 Aug 2026 02:01:04 GMT</pubDate>
            <atom:updated>2026-08-27T02:01:03.978Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ave2P2hpEh-rAHBaCHFhjA.jpeg" /><figcaption>Image Generated by Gemini AI</figcaption></figure><p>Welcome back.</p><p>If you read Part 1, you already have <strong>six artifact categories down</strong>: modified user accounts, shell history, persistence mechanisms, networking, processes, and log files. That’s the classic Linux DFIR checklist — solid ground, and if you ran it against a real system like I challenged you to, you probably came away with either a clean baseline or a “huh, that’s weird” moment worth chasing.</p><p>If you’re arriving fresh, go grab Part 1 first — the artifact mindset it lays out (attackers touch things, and everything they touch leaves a trace) is the foundation everything below builds on.</p><p>This is where the checklist runs out and the real hunting starts. Six single-host artifact categories will catch a lot, but they won’t catch the attacker who’s using eBPF to blind your tooling at the kernel level, the cryptominer hiding behind a tampered PAM module, or the credential thief who never touched a shell at all and just asked your cloud’s metadata service nicely. Part 2 covers auditd, rootkits — including the eBPF-based stealth techniques reshaping Linux rootkit tradecraft right now — containers, Kubernetes, and cloud credential theft, supply chain compromise, file integrity baselines, timestomping, memory forensics, hunting at fleet scale, and finally, the systematic methodology that ties every artifact category from both parts into one repeatable hunting process.</p><p>Let’s keep going.</p><h3>The Auditd Advantage: When You Need More</h3><p>Sometimes basic logs aren’t enough. That’s when auditd becomes your best friend.</p><p>Auditd is Linux’s built-in auditing framework. When properly configured, it can log file accesses, system calls, user activity — basically everything.</p><p>Where to look:</p><ul><li>/var/log/audit/audit.log (good luck reading that raw)</li><li>Use ausearch to search: ausearch -m USER_AUTH -ts today</li><li>Use aureport for summaries: aureport -l (login reports)</li></ul><p>The format is painful, but the data is priceless.</p><h3>Rootkits: The Stealthy Ones (2026 Update)</h3><p>Rootkits deserve special attention because they’re designed specifically to not be found. Historically, that meant kernel modules — Syslogk, Mirai variants, and similar Linux rootkits that operate in kernel space, hide their processes, and generally make your life difficult.</p><p>Hunting for kernel module rootkits:</p><ol><li>Check loaded kernel modules:</li></ol><pre>lsmod | grep -v &quot;^\(&quot;$(cat /proc/modules | cut -d&quot; &quot; -f1 | tr &#39;\n&#39; &#39;|&#39;)&quot;\)&quot;</pre><ol><li>Look for modules with weird names or that don’t match your baseline.</li><li>Use rootkit detectors:</li></ol><pre>rkhunter --check<br>chkrootkit</pre><p>These aren’t perfect, but they catch known rootkits.</p><ol><li>Look for signs of hiding:</li></ol><ul><li>Processes that don’t show up in ps but exist in /proc</li><li>Network connections to suspicious IPs without corresponding processes</li><li>Files that disappear when you try to list them</li></ul><ol><li>Check for kernel tainting:</li></ol><pre>cat /proc/sys/kernel/tainted</pre><p>Non-zero values mean something loaded that tainted the kernel — possibly a malicious module.</p><p>The Syslogk rootkit I covered in my Taiwan presentation is a great example. It hides itself from lsmod but leaves traces — like the /proc/syslogk interface. If you know what to look for, you can find it.</p><p><strong>But kernel modules are no longer the whole story.</strong> The current frontier of Linux rootkit tradecraft is <strong>eBPF</strong> — the in-kernel virtual machine originally built for safe, high-performance networking and observability, now being repurposed for exactly the kind of stealth that used to require a hand-rolled kernel module. Recent research has documented eBPF-capable rootkits like <strong>LinkPro</strong> and <strong>VoidLink</strong>, both of which specifically target cloud and container environments rather than traditional bare-metal servers — which should sound familiar, because it’s exactly the gap in “where we hunt” that this article is about to address.</p><p>What makes eBPF rootkits different from a classic LKM: instead of just hiding files or processes, an eBPF program can attach at the syscall or tracepoint level and selectively filter what monitoring tools <em>themselves</em> see — effectively blinding EDR and audit tooling at the source, rather than lying to ls after the fact. That&#39;s a meaningfully harder problem than a userland LD_PRELOAD hook.</p><p>Add this to your rootkit-hunting routine:</p><pre># Enumerate loaded eBPF programs<br>bpftool prog list<br># Look closely at anything attached via kprobe or tracepoint that you can&#39;t account for<br>bpftool prog list | grep -E &quot;kprobe|tracepoint&quot;</pre><p>Unexplained eBPF programs — especially ones attached to syscalls like openat, execve, or connect — deserve the same scrutiny you&#39;d give an unexplained kernel module. This is a fast-moving area of research, so treat rootkit hunting as something you revisit quarterly, not something you check once and consider solved.</p><h3>Beyond the Single Host: Containers, Kubernetes, and Cloud</h3><p>Here’s the thing about the checklist above: it assumes a single, persistent, bare-metal-style Linux box. That’s a fine assumption in 2015. It’s a dangerous assumption now — because if Linux runs the world, an increasing share of that world is ephemeral, orchestrated, and cloud-native, and none of it behaves the way a traditional server does.</p><p><strong>Container and Kubernetes forensics.</strong> The first thing that breaks about your normal workflow: ephemeral containers mean your “check file mtimes” instinct often doesn’t work, because the entire filesystem can vanish the moment the container restarts. What to check instead:</p><ul><li>docker.sock exposed inside a container — this is effectively a root-equivalent handle to the whole host, and mounting it into a container is one of the most common ways an attacker escalates from &quot;I popped an app&quot; to &quot;I own the node.&quot;</li><li>Privileged containers (--privileged, or securityContext.privileged: true in a Kubernetes pod spec) — flag these on sight during any hunt.</li><li>Host paths mounted read-write inside a container that the workload has no legitimate reason to need — /, /etc, /var/run/docker.sock, or any hostPath volume broader than the app actually requires.</li><li>New host-level cron entries, systemd units, or SSH keys that appear immediately after a suspicious container was scheduled — this is often the first sign an escape actually happened, since the attacker’s <em>next</em> move is almost always to plant persistence somewhere that survives the container’s death.</li><li>/var/log/containers/ and your orchestrator&#39;s own audit log (Kubernetes API server audit logs, in particular) for exec calls into running pods — an interactive kubectl exec into a production pod, outside of a deploy or a known debugging session, is worth investigating on its own.</li></ul><p><strong>Cloud credential theft.</strong> Every major cloud provider exposes an instance metadata service at 169.254.169.254, and it is one of the single richest targets on a compromised cloud host — a successful request can hand over the full temporary credentials for whatever IAM role the instance is running as, no further exploitation required. Hunt for:</p><ul><li>Application logs showing outbound requests to 169.254.169.254 — especially from an app with a known SSRF vulnerability, or one that has no legitimate reason to talk to the metadata service at all.</li><li>Your cloud provider’s own audit trail (CloudTrail, GCP Audit Logs, Azure Activity Log) showing API calls made using that instance’s role, originating from a source IP that isn’t the instance itself — that’s the tell that stolen credentials are being used <em>off-box</em>.</li><li>Locally cached credentials: ~/.aws/credentials, ~/.config/gcloud/, ~/.azure/ — and cloud CLI command history as its own artifact class, right alongside shell history.</li><li>IAM actions being called that the application itself would never plausibly need — a web app’s role suddenly calling iam:CreateUser or s3:GetObject against buckets outside its own scope is a loud signal once you know to look for it.</li></ul><h3>Supply Chain Compromise</h3><p>Not every compromise starts with someone SSHing in. A growing number start upstream — in a build pipeline, a dependency, or a base image — and the first artifacts you’ll see are nowhere near /etc/passwd.</p><p>What to check:</p><ul><li>pip, npm, and gem install logs for unfamiliar package names, especially typosquats of popular packages (a single transposed letter is enough).</li><li>curl | bash patterns inside build scripts and CI configuration — a shockingly common install pattern that pipes an unverified remote script straight into a shell with build-pipeline privileges.</li><li>Outbound network connections initiated <em>during</em> a build step rather than at runtime — legitimate dependency installation rarely needs to phone home to anywhere but the package registry itself.</li><li>Modified lockfiles (package-lock.json, Pipfile.lock, Gemfile.lock) that don&#39;t match what&#39;s committed in version control — a mismatch here means something changed dependency resolution outside of your normal review process.</li></ul><h3>File Integrity Baselines</h3><p>You can’t spot a tampered system binary if you don’t know what the untampered version looked like. This is the one category of hunting that pays for itself the moment you set it up, because most of the tooling is already sitting on the box.</p><p>The fast, no-extra-tooling option — package-manager-native verification:</p><pre># Debian/Ubuntu<br>debsums -c<br>dpkg --verify</pre><pre># RHEL/CentOS/Fedora<br>rpm -Va</pre><p>Both compare installed files against the cryptographic hashes recorded at install time. A modified pam_unix.so (see the persistence section above) or a trojanized ls/ps/netstat binary will show up here immediately, without needing any separate agent.</p><p>For a more rigorous, ongoing baseline, tools like <strong>AIDE</strong> or <strong>Tripwire</strong> build and periodically re-check a full file integrity database across the filesystem — worth the setup effort on anything you consider high-value, precisely because it turns “was this file changed?” from a forensic question into a scheduled report.</p><h3>Timestomping Detection</h3><p>Attackers who know they’re being hunted will reset a file’s modification time to blend in with its surroundings — touch -r against a legitimate neighboring file is a one-line move. What they forget, more often than you&#39;d think, is that changing a file&#39;s content or permissions updates its <strong>ctime</strong> (change time) regardless of what they do to mtime.</p><pre>stat -c &#39;%x %y %z %w&#39; /path/to/suspicious/file</pre><p>That prints access time, modify time, change time, and (on filesystems that support it) creation time side by side. A file whose mtime says “six months ago” but whose ctime says “eleven minutes ago” has been touched recently — the timestomping attempt is the finding.</p><h3>When Disk Isn’t Enough: Memory Forensics</h3><p>Everything in this article so far assumes evidence lives on disk. Fileless execution via memfd_create (mentioned in the processes section) and in-memory-only implants exist specifically to break that assumption.</p><p>For a live acquisition, <strong>LiME</strong> (Linux Memory Extractor) captures a full memory image you can pull off-box. For analysis, <strong>Volatility 3</strong> has mature Linux support and can reconstruct process lists, network connections, and loaded kernel modules directly from that memory image — catching things that never left a trace on disk at all. You won’t need this for most hunts. You’ll be very glad you know it exists for the ones where the disk artifacts just don’t add up.</p><h3>Hunting at Fleet Scale</h3><p>Every technique above describes hunting one box at a time. That’s fine for an incident. It doesn’t scale to “check all 500 production hosts for this indicator by end of day.”</p><p>This is where a tool like <strong>osquery</strong> earns its keep — it exposes the operating system as a queryable SQL table, so a question like “which hosts have an unexpected line in /etc/ld.so.preload&quot; becomes a single query you run across your entire fleet instead of 500 SSH sessions. Pair it with a runtime detection layer like <strong>Falco</strong> for containers, and the checklist in this article stops being a manual process and starts being something you can actually operationalize.</p><h3>A Systematic Approach: Putting It All Together</h3><p>So you have all these artifacts. Now what? How do you actually hunt systematically?</p><p>Here’s my process:</p><p><strong>Step 1: Establish Your Baseline</strong></p><p>You can’t find “weird” if you don’t know what “normal” looks like. What processes usually run? What users normally exist? What cron jobs are legitimate? Your best sources of ground truth here are golden images, your config management state (Ansible/Puppet/Chef), and your CMDB or asset inventory — not just “I’ve been staring at this server long enough to know.”</p><p><strong>Step 2: Form a Hypothesis</strong></p><p>“I think someone might have compromised this server and created a backdoor user account.”</p><p><strong>Step 3: Collect Relevant Data</strong></p><p>Based on your hypothesis, gather:</p><ul><li>/etc/passwd and /etc/shadow modification times</li><li>List of users with shells</li><li>sudoers file contents</li><li>SSH authorized_keys files</li></ul><p><strong>Step 4: Analyze and Investigate</strong></p><p>Found a user that shouldn’t exist? Great — now pivot:</p><ul><li>Check shell history for that user</li><li>Look for their login times in wtmp</li><li>See what processes they ran</li><li>Check cron jobs they might have created</li></ul><p><strong>Step 5: Repeat</strong></p><p>One finding leads to another. Follow the thread.</p><p>That’s the process — baseline, hypothesis, collect, analyze, repeat — and it’s deliberately simple, because the complexity in Linux hunting was never in the methodology. It’s in knowing which artifacts to feed into it. That’s what these two posts have been building toward: fourteen artifact categories, from /etc/passwd modification times to eBPF program enumeration to cloud IAM audit trails, all in service of the same five-step loop.</p><p>Here’s my challenge to you, same as before, but bigger this time: pick one Linux system this week — a test box, a container, a cloud instance, whatever you’ve got — and hunt it with everything from both parts. Check the accounts. Check ld.so.preload. Check for eBPF programs you can&#39;t explain. If it&#39;s a cloud instance, check whether anything&#39;s been talking to 169.254.169.254. If it&#39;s a container host, check for an exposed docker.sock.</p><p>You might find nothing. That’s fine — now you have a real baseline, built the right way, and you’ll know the moment something changes.</p><p>Or you might find something weird. And that weird thing? That’s where the fun begins.</p><p>Because the artifacts are there. They’re always there — on a bare-metal box, in a container, in a cloud audit log, in an eBPF program table nobody thought to check. You just need to know where to look. Now you do.</p><p>See you in Part 3!</p><p>Long Live Cyber Defender!!!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=674392b1de71" width="1" height="1" alt=""><hr><p><a href="https://medium.com/fmisec/hunting-the-evil-a-practical-guide-to-linux-threat-hunting-part-2-674392b1de71">Hunting the Evil : A Practical Guide to Linux Threat Hunting — Part 2</a> was originally published in <a href="https://medium.com/fmisec">FMI Cyber Security Consulting Services</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>