什么是 Nmap 脚本引擎?
Nmap 的另一个强大功能是能够使用各种脚本运行扫描,以自动化工作或根据需要自定义安全审核。使用这些脚本通过其原生的Nmap 脚本引擎(NSE) 从 Nmap 中获得更大的多功能性和功能性。
NSE 附带了大量脚本。其中许多脚本是由安全专业人员创建和维护的,他们随着漏洞和攻击的发展而不断为这些脚本做出贡献。在开始每个会话之前,请运行命令 <nmap –script-updatedb>(如果您不是 root 帐户,则需要 <sudo>)。
这些脚本按网络发现、复杂版本检测、漏洞检测、后门检测和漏洞利用进行分类。一些脚本使用简单技术,另一些脚本使用复杂技术。您还可以使用 Lua 编程语言创建自己的脚本。
基本扫描
Nmap 命令包含三个元素:
扫描类型- 这告诉 Nmap 将执行哪种类型的扫描,例如:-sS 表示 TCP SYN 扫描,-sU 表示 UDP 扫描,或 -sn 表示 ping 扫描。
选项- 指定扫描的其他元素,例如:-O 表示操作系统、-p 表示端口范围或 -A 表示详细信息。
目标- 将目标定义为单个 IP 地址、IP 地址范围或域。
这些命令可能很难记住。在我们的Nmap 备忘单:所有命令、标志和开关中,可以以易于使用的格式找到它们。
精心设计的扫描被认为是使用 Nmap 扫描漏洞的基础。此类扫描的结果将返回有关哪些端口已打开以及在这些端口上运行哪些服务的信息。
可以使用诸如<nmap -p- -A <目标IP>>的命令执行这样的扫描。
此命令指示 Nmap 使用 -p- 标志扫描所有端口,并使用 -A 标志返回有关目标主机的详细信息。然后可以使用这些结果来识别目标主机上存在的潜在安全风险和漏洞。
Nmap 的另一个强大功能是能够使用各种脚本运行扫描,以自动化工作或根据需要自定义安全审核。使用这些脚本通过其原生的Nmap 脚本引擎(NSE) 从 Nmap 中获得更大的多功能性和功能性。
NSE 附带了大量脚本。其中许多脚本是由安全专业人员创建和维护的,他们随着漏洞和攻击的发展而不断为这些脚本做出贡献。在开始每个会话之前,请运行命令 <nmap –script-updatedb>(如果您不是 root 帐户,则需要 <sudo>)。
这些脚本按网络发现、复杂版本检测、漏洞检测、后门检测和漏洞利用进行分类。一些脚本使用简单技术,另一些脚本使用复杂技术。您还可以使用 Lua 编程语言创建自己的脚本。
基本扫描
Nmap 命令包含三个元素:
扫描类型- 这告诉 Nmap 将执行哪种类型的扫描,例如:-sS 表示 TCP SYN 扫描,-sU 表示 UDP 扫描,或 -sn 表示 ping 扫描。
选项- 指定扫描的其他元素,例如:-O 表示操作系统、-p 表示端口范围或 -A 表示详细信息。
目标- 将目标定义为单个 IP 地址、IP 地址范围或域。
这些命令可能很难记住。在我们的Nmap 备忘单:所有命令、标志和开关中,可以以易于使用的格式找到它们。
精心设计的扫描被认为是使用 Nmap 扫描漏洞的基础。此类扫描的结果将返回有关哪些端口已打开以及在这些端口上运行哪些服务的信息。
可以使用诸如<nmap -p- -A <目标IP>>的命令执行这样的扫描。
此命令指示 Nmap 使用 -p- 标志扫描所有端口,并使用 -A 标志返回有关目标主机的详细信息。然后可以使用这些结果来识别目标主机上存在的潜在安全风险和漏洞。
在保护无线网络时,有几种加密类型可供选择。其中包括
-无线等效保护协议
-水务及私人有限公司
-WPA2
-WPA2 企业版
WEP 代表有线等效保密。尽管名字如此,但它的私密性远不如有线连接。它完全被贬低了,因为它可以在几秒钟内被黑客入侵。由于遗留原因,一些路由器仍会将其作为选项提供。永远不要使用它。大多数企业都知道这一点。如果在渗透测试中看到它,可以在当天下午早点下班,因为这是做过的最简单的无线黑客攻击。
遇到的常见加密方法是 WPA2 和 WPA2 Enterprise。它们之间的区别,用非常高层次和简单的解释来说,是企业版将为域中的每个成员提供安全登录。这意味着,与每个人都使用一个密码访问 WiFi(就像您在家里看到的那样)不同,每个用户都有自己的用户名和密码。
攻击 WPA2 Enterprise 超出了本文的讨论范围。许多中小型企业和任何家用路由器都可能设置为 WPA2,这就是我们今天要攻击的对象。
-无线等效保护协议
-水务及私人有限公司
-WPA2
-WPA2 企业版
WEP 代表有线等效保密。尽管名字如此,但它的私密性远不如有线连接。它完全被贬低了,因为它可以在几秒钟内被黑客入侵。由于遗留原因,一些路由器仍会将其作为选项提供。永远不要使用它。大多数企业都知道这一点。如果在渗透测试中看到它,可以在当天下午早点下班,因为这是做过的最简单的无线黑客攻击。
遇到的常见加密方法是 WPA2 和 WPA2 Enterprise。它们之间的区别,用非常高层次和简单的解释来说,是企业版将为域中的每个成员提供安全登录。这意味着,与每个人都使用一个密码访问 WiFi(就像您在家里看到的那样)不同,每个用户都有自己的用户名和密码。
攻击 WPA2 Enterprise 超出了本文的讨论范围。许多中小型企业和任何家用路由器都可能设置为 WPA2,这就是我们今天要攻击的对象。
获取回显
在实际的渗透测试环境下,如果目标主机不出网,将无法反弹shell进行利用,而且反弹shell这种敏感操作也容易触发安全警报。而由于目标环境的原因,web shell不一定都可以执行,实现命令执行的回显利用就显得比较重要了。目前来说,通用的回显思路不外乎以下的几种:
1. 利用报错。实现的方法是在代码执行的时候将所执行命令的结果直接使用异常进行抛出,因为异常没有被捕获处理的原因将会抛出在页面上。
2. 写入到文件。这个方式不难理解了,将命令执行的回显输出到文件,然后进行访问。
3. 获取当前线程中绑定的输出流对象,调用输出的方法进行输出。
4. rmi之类的通过实现服务端,重新注册之后,正常去调用即可。
在实际的渗透测试环境下,如果目标主机不出网,将无法反弹shell进行利用,而且反弹shell这种敏感操作也容易触发安全警报。而由于目标环境的原因,web shell不一定都可以执行,实现命令执行的回显利用就显得比较重要了。目前来说,通用的回显思路不外乎以下的几种:
1. 利用报错。实现的方法是在代码执行的时候将所执行命令的结果直接使用异常进行抛出,因为异常没有被捕获处理的原因将会抛出在页面上。
2. 写入到文件。这个方式不难理解了,将命令执行的回显输出到文件,然后进行访问。
3. 获取当前线程中绑定的输出流对象,调用输出的方法进行输出。
4. rmi之类的通过实现服务端,重新注册之后,正常去调用即可。
如何在Android Nougat中正确配置Burp Suite?
此前我已经在Genymotion VM或我的旧版Nexus Tablet,做过不少Android相关的测试。一直以来我都遵循Portswigger的说明文档,本地运行Burp Suite,并安装User Cert,配置一个WiFi代理。
然而,当我对这个特定app(需要API level 24 (Android 7.0 - "Nougat"))测试时,突然发现Burp无法正常工作。我回顾了我的配置步骤,并没有发现遗漏的地方,但在Burp中只看到“connection reset(连接重置)”错误:从Nougat开始,Android更改了对用户安装证书的默认信任行为。这意味着,从sdcard安装Burp CA将无法拦截应用流量。除非另有说明,否则应用程序将只会信任系统级别的CA。
这里有两种方法可以帮我们绕过它:
将Burp CA作为系统级CA安装在设备上。这是我认为最简单的解决方法,但需要一个已经root的设备。还免去了设置锁屏PIN码的的麻烦:)
修改manifest清单文件并重新打包应用程序。 操作步骤相对繁琐,但不需要root权限。
注意:我在Windows 10上使用Burp Suite Pro完成了这些操作,使用的是Android 7.1(API25)Genymotion VM,但这些步骤应适用于任何设置。
此前我已经在Genymotion VM或我的旧版Nexus Tablet,做过不少Android相关的测试。一直以来我都遵循Portswigger的说明文档,本地运行Burp Suite,并安装User Cert,配置一个WiFi代理。
然而,当我对这个特定app(需要API level 24 (Android 7.0 - "Nougat"))测试时,突然发现Burp无法正常工作。我回顾了我的配置步骤,并没有发现遗漏的地方,但在Burp中只看到“connection reset(连接重置)”错误:从Nougat开始,Android更改了对用户安装证书的默认信任行为。这意味着,从sdcard安装Burp CA将无法拦截应用流量。除非另有说明,否则应用程序将只会信任系统级别的CA。
这里有两种方法可以帮我们绕过它:
将Burp CA作为系统级CA安装在设备上。这是我认为最简单的解决方法,但需要一个已经root的设备。还免去了设置锁屏PIN码的的麻烦:)
修改manifest清单文件并重新打包应用程序。 操作步骤相对繁琐,但不需要root权限。
注意:我在Windows 10上使用Burp Suite Pro完成了这些操作,使用的是Android 7.1(API25)Genymotion VM,但这些步骤应适用于任何设置。
dubbo协议。其实这里打的就是hessian反序列化这个已经比较熟悉了。 看一下这个数据包。
典型的三次握手和四次挥手。dabb是dubbo的协议头。里面有hessian序列化的数据,然后 c 发送。s 确认收到。然后s再发。
这个漏洞主要是因为hessian引起的。
com.alibaba.com.caucho.hessian.io.Hessian2Output#writeString(java.lang.String)
就是在provider解析数据的时候,本应该是in.readUTF()。
但是我们构造数据包的时候用的是 out.writeObject(payload());
结果provider解析异常,然后会触发 payload() 的toString 方法。
如果此时如果有toString2rce的gadget。就会有被攻击的风险。
典型的三次握手和四次挥手。dabb是dubbo的协议头。里面有hessian序列化的数据,然后 c 发送。s 确认收到。然后s再发。
这个漏洞主要是因为hessian引起的。
com.alibaba.com.caucho.hessian.io.Hessian2Output#writeString(java.lang.String)
就是在provider解析数据的时候,本应该是in.readUTF()。
但是我们构造数据包的时候用的是 out.writeObject(payload());
结果provider解析异常,然后会触发 payload() 的toString 方法。
如果此时如果有toString2rce的gadget。就会有被攻击的风险。
freemarker.template.utility.ObjectConstruct 是 FreeMarker 模板引擎中的一个辅助类,主要用于创建 Java 对象,并将其转换为 FreeMarker 可以识别和处理的模板数据模型。这使得模板可以动态地实例化对象,并将它们传递给模板进行渲染。
freemarker.template.utility.JythonRuntime 是 FreeMarker 模板引擎中的一个辅助类,它用于与 Jython(一个基于 Java 的 Python 解释器)进行交互。通过这个类,FreeMarker 模板可以执行 Python 脚本,从而在模板中动态执行 Python 代码,并将结果用于模板渲染。
freemarker.template.utility.JythonRuntime 是 FreeMarker 模板引擎中的一个辅助类,它用于与 Jython(一个基于 Java 的 Python 解释器)进行交互。通过这个类,FreeMarker 模板可以执行 Python 脚本,从而在模板中动态执行 Python 代码,并将结果用于模板渲染。
导入表(Import Directory)存储了有关PE文件在运行的生命周期中所需要的API以及相关的dll模块。
有些AV/EDR会根据
导入表中记录的API来判定一个程序是否为高危文件,比如说一个文件在1MB以内,出现了 VirtualAlloc、VirtualProtect、CreateThread 等敏感API时,很大概率会判定为高危文件。
很多工具可以查看文件的导入表,常见的有studyPE+、IDA。
在本节中,我将详细介绍动态获取API函数的三种方式,它们分别是
1. GetModuleHandle+GetProcAddress 的组合获取所需的API函数指针
2. 使用 PEB 获取 GetModuleHandle 和 GetProcAddress 的函数指针,再利用 GetModuleHandle+GetProcAddress 获取所需要的API函数指针
3. 使用 PEB 获取所需要的API函数指针
网上也有人用 LoadLibrary 作为 GetModuleHandle 的平替,其效果相差无几,只是它们的机制有些区别,比如说在 自举的代码幽灵——反射DLL注入(Reflective DLL Injection) 中我们就是利用 LoadLibrary+GetProcAddress 给我的恶意DLL加载相应的DLL获取需要的API函数指针,值得关注的一点是恶意DLL是由其自身的导出函数 ReflectiveLoader 完成自身的加载,这意味着相应的DLL并没有加载到自身的地址空间中,所以需要利用 LoadLibrary 而不应该使用 GetModuleHandle。
有些AV/EDR会根据
导入表中记录的API来判定一个程序是否为高危文件,比如说一个文件在1MB以内,出现了 VirtualAlloc、VirtualProtect、CreateThread 等敏感API时,很大概率会判定为高危文件。
很多工具可以查看文件的导入表,常见的有studyPE+、IDA。
在本节中,我将详细介绍动态获取API函数的三种方式,它们分别是
1. GetModuleHandle+GetProcAddress 的组合获取所需的API函数指针
2. 使用 PEB 获取 GetModuleHandle 和 GetProcAddress 的函数指针,再利用 GetModuleHandle+GetProcAddress 获取所需要的API函数指针
3. 使用 PEB 获取所需要的API函数指针
网上也有人用 LoadLibrary 作为 GetModuleHandle 的平替,其效果相差无几,只是它们的机制有些区别,比如说在 自举的代码幽灵——反射DLL注入(Reflective DLL Injection) 中我们就是利用 LoadLibrary+GetProcAddress 给我的恶意DLL加载相应的DLL获取需要的API函数指针,值得关注的一点是恶意DLL是由其自身的导出函数 ReflectiveLoader 完成自身的加载,这意味着相应的DLL并没有加载到自身的地址空间中,所以需要利用 LoadLibrary 而不应该使用 GetModuleHandle。