编程知识 cdmana.com

windows提权小结

当以低权用户进去一个陌生的windows机器后,无论是提权还是后续做什么,第一步肯定要尽可能的搜集信息。知己知彼,才百战不殆。

常规信息搜集

systeminfo 查询系统信息
hostname 主机名
net user 查看用户信息
netstat -ano|find "3389" 查看服务pid号
wmic os get caption 查看系统名
wmic qfe get Description,HotFixID,InstalledOn 查看补丁信息
wmic product get name,version 查看当前安装程序
wmic service list brief 查询本机服务
wmic process list brief 查询本机进程
net share 查看本机共享列表
netsh firewall show config 查看防火墙配置

常见的杀软如下:

360sd.exe 360杀毒
360tray.exe 360实时保护
ZhuDongFangYu.exe 360主动防御
KSafeTray.exe 金山卫士
SafeDogUpdateCenter.exe 安全狗
McAfee McShield.exe McAfee
egui.exe NOD32
AVP.exe 卡巴斯基
avguard.exe 小红伞
bdagent.exe BitDefender

要搜集的信息大致如下几点:

机器的系统及其版本
机器的打补丁情况
机器安装的服务
机器的防火墙策略配置
机器的防护软件情况

提权操作

有充足的信息的情况下,可以有针对性的实行各种提权操作。以下列举部分操作。

内核提权

这是根据系统的版本信息和补丁信息,利用系统本身存在的漏洞,可参考链接:https://github.com/SecWiki/wi...
要检测漏洞可以参考链接:https://github.com/ianxtianxt...
也可以参考链接:https://github.com/brianwrf/W...
msf中也内置了很多exp。

Windows-Expolit-suggester
Windows ClientCopyImage Win32k Exploit
Windows TrackPopupMenu Win32k NULL Pointer Dereference
通过Kitrap0D进行Windows系统提权
Windows Escalate任务计划程序XML提权
MS16-016mrxdav.sys WebDav本地提权
EPATHOBJ::pprFlattenRec本地提权
MS13-053 : NTUserMessageCall Win32k内核池溢出
MS16-032 Secondary Logon Handle提权
RottenPotato提权

利用过程如下图所示:
图片.png

at命令利用

在Windows2000、Windows 2003、Windows XP 这三类系统中,我们可以使用at命令将权限提升至system权限。
at 是一个发布定时任务计划的命令行工具,语法比较简单。通过 at 命令发布的定时任务计划, Windows 默认以 SYSTEM 权限运行。定时任务计划可以是批处理、可以是一个二进制文件。可以通过 “/interactive”开启界面交互模式:
图片.png
在得到一个system的cmd之后,使用 taskmgr 命令调用任务管理器,此时的任务管理器是system权限,然后kill掉explore进程,再使用任务管理器新建explore进程,将会得到一个system的桌面环境
图片.png
也可以在msf下生成木马文件,at命令执行运行程序,上线后即为system权限。

sc命令利用

适用于windows 7/8、03/08、12/16
SC 是用于与服务控制管理器和服务进行通信的命令行程序。提供的功能类似于“控制面板”中“管理工具”项中的“服务”。
sc Create syscmd binPath= "cmd /K start" type= own type= interact

这个命令的意思是创建一个名叫 syscmd 的新的交互式的 cmd 服务,然后执行以下命令,就得到了一个system权限的cmd环境:

sc start systcmd

Unattended Installs

自动安装允许程序在不需要管理员关注下自动安装。这种解决方案用于在拥有较多雇员和时间紧缺的较大 型组织中部署程序。如果管理员没有进行清理的话,那么会有一个名为Unattend的XML文件残存在系统上。 这个XML文件包含所有在安装程序过程中的配置,包括一些本地用户的配置,以及管理员账户。
全盘搜索Unattend文件是个好办法,它通常会在以下一个文件夹中:

C:WindowsPanther 
C:WindowsPantherUnattend 
C:WindowsSystem32 
C:WindowsSystem32sysprep

除了Unattend.xml文件外,还要留意系统中的sysprep.xml和sysprep.inf文件,这些文件中都会包含部署操作 系统时使用的凭据信息,这些信息可以帮助我们提权。

C:UsersuserDesktop> dir C:*vnc.ini /s /b /c
#或者在名称中包含关键词的项目:
C:UsersuserDesktop> dir C: /s /b /c | findstr /sr *password*
 #或者可以在文件内容中搜索password之类的关键字:
C:UsersuserDesktop>findstr /si password *.txt | *.xml | *.ini
 #可以查询注册表,例如,字符串password:
reg query HKLM /f password /t REG_SZ /s
reg query HKCU /f password /t REG_SZ /s

在这些文件中通常包含用户名和密码,密码使用base64编码,并且在最后会附加”Password”,所以真正的密 码需要去掉最后的”Password”。
图片.png

dll劫持

Windows程序启动的时候需要DLL。如果这些DLL 不存在,则可以通过在应用程序要查找的位置放置恶意DLL来提权。
通常,Windows应用程序有其预定义好的搜索DLL的路径,它会根据下面的顺序进行搜索:

1、应用程序加载的目录
2、32位系统目录(C:\Windows\System32)
3、16位系统目录(C:\Windows\System)
4、Windows目录 (C:\Windows)
5、当前工作目录(Current Working Directory,CWD)
6、在PATH环境变量的目录(先系统后用户)

HKEY_LOCAL_MACHINESYSTEMCurrentControlSetservicesServiceNameParameters可以查询注册表项以查看服务运行的服务DLL,或者可以将二进制文件加载到IDA中并搜索loadlibrary库调用。另外一定要检查DLL本身的DLL调用!
一旦找到易受攻击的DLL调用,就必须检查该DLL的文件系统:

C:> dir vulnerable.dll /s

还要注意,不要因为它找不到就认为它不存在。它可能只是在当前用户帐户无法查看的目录中。
最后,要执行DLL highjack,需要在目录层次结构中的某个位置,原始.dll本身,CWD或PATH中的目录中编写安全测试的dll。
PATH是一个环境变量,它定义命令解释器在发出命令时应查找可执行文件的位置。修改PATH,并将.dll写入PATH中的目录,允许进行DLL劫持,进程在PATH中搜索.dll文件。
一些已知具有DLL劫持漏洞的Windows服务是:

IKE和AuthIP IPsec密钥模块(IKEEXT):wlbsctrl.dll
Windows Media Center接收器服务(ehRecvr):ehETW.dll
Windows Media Center计划程序服务(ehSched):ehETW.dll
自动更新(wuauserv):ifsproxy.dll
远程桌面帮助会话管理器(RDSessMgr):SalemHook.dll
远程访问连接管理器(RasMan):ipbootp.dll
Windows Management Instrumentation(winmgmt):wbemcore.dll
音频服务(STacSV):SFFXComm.dll SFCOM.DLL
英特尔快速存储技术(IAStorDataMgrSvc):DriverSim.dll
Juniper统一网络服务(JuniperAccessService):dsLogService.dll
Encase Enterprise Agent:SDDisk.dll

有许多工具和框架可以使提权变得更容易:

Metasploit
Sherlock
windows-privesc-check
Windows-Exploit-Suggester
PowerUp, now part of PowerSploit
Nishang

如下,PowerUp检测到了一个潜在的DLL挟持漏洞。通常,我们用PowerUp的Write-HijackDll函数写恶意DLL,并重启该应用程序。当启动该应用程序时,它会加载该恶意DLL并以更高的权限运行我们的代码。
图片.png

未使用双引号的服务路径

当系统管理员配置Windows服务时,他们必须指定要执行的命令,或者运行可执行文件的路径,要运行的二进制文件的位置在binPath属性中声明。。
当Windows服务运行时,会发生以下两种情况之一。如果给出了可执行文件,并且引用了完整路径,则系统会按字面解释它并执行。但是,如果服务的二进制路径未包含在引号中,则操作系统将会执行找到的空格分隔的服务路径的第一个实例。
如果binPath是这样设置的:
C:Program FilesUnquoted Path ServiceCommon Filesservice.exe
Windows会根据以下顺序进行查找:

1.  C:Program.exe
2.  C:Program FilesUnquoted.exe
3.  C:Program FilesUnquoted Path.exe
4.  C:Program FilesUnquoted Path ServiceCommon.exe
5.  C:Program FilesUnquoted Path ServiceCommon Filesservice.exe

也就是说如果不加引号,我们可以构造一个与第一个名称相同的恶意二进制文件作为文件系统对象,并在其名称中包含空格,并且当服务尝试执行其二进制文件时会将它运行。我们所需要的只是对路径中目录的写权限。

一条命令找到这些错误配置:

wmic service get name,displayname,pathname,startmode |findstr /i "Auto" |findstr /i /v "C:Windows" |findstr /i /v """

利用PowerUp也可以:
图片.png
同样的如果低权用户有服务指向二进制文件所在文件夹的写权限,则他可以直接将恶意文件上传并重命名以替换正常文件。如果用户可以修改服务配置,则可以直接修改binPath指向恶意的文件。

更多可以参看链接:
https://www.cnblogs.com/-mo-/...
https://bbs.pediy.com/thread-...
https://xz.aliyun.com/t/2519#...

版权声明
本文为[长安乱]所创,转载请带上原文链接,感谢
https://segmentfault.com/a/1190000038138448

Scroll to Top