原文:http://resources.infosecinstitute.com/authentication-hacking-pt1/
认证是识别某个事物的真伪。当一个web客户请求服务器的某个资源的时候,有时服务器可能需要识别用户的身份。因此用户必须体用一些口令以及web服务器来识别它,然后根据user的口令来采取相应的措施。这个过程叫做认证。一旦用户通过认证了,web服务器根据user相应的权限提供相应的资源。当用户希望获得某个资源时,服务器会检查用户是否有相应的权限。这个过程叫做授权。本文将会介绍常用的认证方法,然后介绍如何攻击这些认证方法。
本文主要使用burp suit以及少量的wireshark。
配置Burp为使用127.0.0.1:8080代理:
[img]http://dl2.iteye.com/upload/attachment/0101/7561/8e78dcbf-41c4-3dbc-9877-6888250afa3f.png[/img]
打开Burpsuite,转到Proxy–>Intercept,确保Intercept is on
[img]http://dl2.iteye.com/upload/attachment/0101/7563/966e2ba8-65b4-306a-b1e4-8a765b7db9ef.png[/img]
转到option标签,检查代理是否监听8080端口。同时确保Generate CA-signed per-host certificates已经设置。每一次user连接到一个SSL保护的website,Buipsuit将会生产一个服务器证书,通过一个单独的在Burpsuit安装时生成的CA证书来签名。它的目的是在代理过程中减少SSL错误(Burp1.5,1.6没有此选项)。
[img]http://dl2.iteye.com/upload/attachment/0101/7565/7c2fa408-d79f-3a63-9361-364490166e88.png[/img]
认证种类
[color=blue]1)基于HTTP认证[/color]
基于HTTP的认证使用username+password来认证一个user。该过程是由user发送一个没有认证口令的GET请求来请求某一个资源开始的。请求有Burp拦截,看起来如下:
[img]http://dl2.iteye.com/upload/attachment/0101/7567/74a9242f-aea2-39d3-978b-776f9e1ee86c.png[/img]
服务器然后在相应头发会“Authorization Required”消息。我们可以通过Wireshark来看到数据包。从header中可以看到,是“Basic”类型认证。浏览器识别出这个应答然后弹出一个请求username/password的对话框。注意对话框是由浏览器显示的而不是应用程序显示的。
[img]http://dl2.iteye.com/upload/attachment/0101/7573/ddc8e5b7-0f06-317f-aec4-959990a5f360.png[/img]
一旦我们输入username和密码,并且使用Burp再次拦截请求,我们可以获得如下结果。最后一行是“Authorization: Basic aW5mb3NlYzppbmZvc2VjaW5zdGl0dXRl”。这是在header中传输的额外信息。Basic后面的是关键信息。他们基本是编码后的口令。用户名和密码使用:连接,并且整体使用base64编码。例如username是“infosec”,密码是“infosecinstitute”然后整体“infosec:infosecinstitute”使用base64编码。服务器获取header的值,解码来获得口令,如果口令正确,那么可以获得访问权限。值得注意的是解密编码后的口令是很常见的事,所以它对于监听攻击非常脆弱。
[img]http://dl2.iteye.com/upload/attachment/0101/7575/f66e9420-cf87-3042-bf19-dd3f485decd8.png[/img]
Wireshark可以识别这个,并且自动解码字符串来获得口令。如下图
[img]http://dl2.iteye.com/upload/attachment/0101/7577/22d6c517-8d23-3e59-b84d-48e624dad79e.png[/img]
从Credentials部分我们可以看到,用户名和密码分别是“infosec”和“infosecinstitute”。基于HTTP认证的一个问题是数据是明文传输的。可以通过SSL来减少风险,SSL使用加密格式来发送数据,所以授权header中的数据不透明。然而,它仍然可以受到很多客户端的攻击,包括MITM.它也可以收到暴力破解攻击。
[color=blue]2)HTTP摘要认证[/color]
摘要认证被设计为基于HTTP认证的一个改善。一个明显的增强是数据不再是明文传送,而是加密格式。user首先发送一个没有任何口令的请求到相应页面。服务器返回一个WWW-Authenticate header来指明需要口令来访问资源。服务器同时发送一个随机值,叫“nonce”。浏览器然后使用一个加密函数来创建一个基于username,password,“nonce”,HTTP methods,和页面的url的摘要。这种情况下的加密函数是一个单向加密函数,意味着数字摘要只可以在一个方向上创建,不可以逆向来获得创建它时的那些信息。默认的,摘要认证使用MD5算法。
摘要访问认证比HTTP基本认证不容易受监听攻击,但是容易遭受重放攻击,例如如果客户端可以重放加密信息,server将会允许客户的访问。然而为了避免这种攻击,服务器的nonce有时包含时间戳。一旦server获得nonce,它检查nonce的属性以及时间是否超时,可能会拒绝访问请求。摘要访问认证的另一个好处是攻击者需要知道其他的四个值(username, nonce, url, http method)来使用字典或暴力破解。这个过程相对于简单的暴力破解更昂贵而且不易成功。
[color=blue]3)基于表单认证[/color]
基于表单认证使用一个包含允许user数据username和password的input标签的表单来进行认证。一旦user提供了信息,它通过HTTP/HTTPS的GET或POST方法来传送信息。在服务器端,如果口令正确,user被认证,对于相应的请求,一些随机token或sessionid返回。对于基于表单认证的一个好处是没有标准的加密username/password方法,所以高度定制化,因而对于HTML基本攻击和摘要认证攻击成功的方法对它可能免疫。基于表单认证攻击是目前web程序中最常用的认证方法。一些基于表单认证的问题是口令是明文传送的除非使用TLS。
来看一个基于表单攻击的例子。我们使用DVWA作为例子.
安全级别设置为高。我们可以看到表单接受username/password,去掉任意格式的特殊字符来避免SQL注入攻击,然后通过一个sql查询语句来确认口令是否正确。
[img]http://dl2.iteye.com/upload/attachment/0101/7585/3ecd1bac-0eb4-3830-bf6b-a15606984535.png[/img]
输入任何的username/password,使用Buip拦截:
[img]http://dl2.iteye.com/upload/attachment/0101/7587/4e19b42c-6a85-3e17-bb8b-d5f8976fc846.png[/img]
[color=blue]攻击Web认证[/color]
我们将会使用暴力破解来攻击High安全级别的DVWA表单认证。注意暴力破解可能不会成功。某些情况下,网站会在若干次失败尝试之后会拒绝你的请求。同时一些网站会使用CAPTCHA来识别发送请求的是否是一个人类。
我们使用Burp中的intruder来进行暴力破解。通常需要username/password来进行暴力破解。在表单中输入username/password,然后拦截请求。截获请求后,右击鼠标选择“send to intruder”。
[img]http://dl2.iteye.com/upload/attachment/0101/7589/5e59c4b0-6d9f-3f90-858d-8935776b48d9.png[/img]
这样会把请求信息发送到intruder。转到intruder标签,现在需要配置Burp来进行暴力破解攻击。在target标签中,我们可以看到target已被设置。
[img]http://dl2.iteye.com/upload/attachment/0101/7591/2b72eb51-22db-3c7a-9817-faf16b584256.png[/img]
现在转到position标签,这里我们可以看到之前我们发送intruder的请求。其中有一些东西被高亮,这些都是由Burp猜测的在每一个请求中可以变化从而用于暴力破解的部分。本例中只有username和password是可以变化的,我们只需进行相应的配置。
[img]http://dl2.iteye.com/upload/attachment/0101/7593/511c28b7-f8ed-348f-8f35-467fe8d733b8.png[/img]
点击clear按键。将会删除所有高亮的文本,现在我们只需要配置username和password来进行攻击。高亮请求中的username(本例中是“infosec”),然后点击Add。相似的,高亮password然后点击Add。这会使username和password变为第一/er个参数。此时输出应该如此。
[img]http://dl2.iteye.com/upload/attachment/0101/7599/7278de83-c410-31fa-92f4-9ef740c88e7a.png[/img]
然后我们需要设置攻击类型。默认设置为Sniper,然而在本例中我们将使用Cluster Bomb。Cluster Bomb的基本原理是使用多个payload组合(1 for username and 1 for the password)。攻击将会先使用payload1的所有值以及payload2的第一个值,然后使用payload1的所有值和payload2的第二个值。如下所示,我们的攻击类型是“Cluster Bomb”。
[img]http://dl2.iteye.com/upload/attachment/0101/7603/eb7c106c-d50b-3fb1-b7a7-9e0159faa5d8.png[/img]
转到payload标签,选择payload set 1,点击load来加载一个含有所有username的文件。如下:
[img]http://dl2.iteye.com/upload/attachment/0101/7605/0e4b3382-4399-376e-9d3f-a993241ceeab.png[/img]
相似,选择payload set 2,加载密码文件
转到option标签,选择result区域中的“store requests”和“store response”选项。检查相应设置
[img]http://dl2.iteye.com/upload/attachment/0101/7607/0a993124-fcc0-3afa-bba5-0c0b35491b81.png[/img]
现在可以开始攻击。点击intruder,然后点击“start attack”。将会看到一个弹出窗口,显示所有的请求。我们如何知道一个攻击是否成功?通常成功的响应和失败的响应会不同,或应答状态不同。本例中,我们可以看到admin/password的那组请求对应的应答与其他的应答相比长度不一样。
[img]http://dl2.iteye.com/upload/attachment/0101/7609/200a45ea-c846-33d8-8c5d-9ccc76034fe6.png[/img]
点击那个长度不同的应答。在response部分,我们可以看到在应答中含有“Welcome to the password protected area admin”文本。从而证明破解成功。
[img]http://dl2.iteye.com/upload/attachment/0101/7611/9503a367-b789-3c7a-a771-78dac09cefa1.png[/img]
认证是识别某个事物的真伪。当一个web客户请求服务器的某个资源的时候,有时服务器可能需要识别用户的身份。因此用户必须体用一些口令以及web服务器来识别它,然后根据user的口令来采取相应的措施。这个过程叫做认证。一旦用户通过认证了,web服务器根据user相应的权限提供相应的资源。当用户希望获得某个资源时,服务器会检查用户是否有相应的权限。这个过程叫做授权。本文将会介绍常用的认证方法,然后介绍如何攻击这些认证方法。
本文主要使用burp suit以及少量的wireshark。
配置Burp为使用127.0.0.1:8080代理:
[img]http://dl2.iteye.com/upload/attachment/0101/7561/8e78dcbf-41c4-3dbc-9877-6888250afa3f.png[/img]
打开Burpsuite,转到Proxy–>Intercept,确保Intercept is on
[img]http://dl2.iteye.com/upload/attachment/0101/7563/966e2ba8-65b4-306a-b1e4-8a765b7db9ef.png[/img]
转到option标签,检查代理是否监听8080端口。同时确保Generate CA-signed per-host certificates已经设置。每一次user连接到一个SSL保护的website,Buipsuit将会生产一个服务器证书,通过一个单独的在Burpsuit安装时生成的CA证书来签名。它的目的是在代理过程中减少SSL错误(Burp1.5,1.6没有此选项)。
[img]http://dl2.iteye.com/upload/attachment/0101/7565/7c2fa408-d79f-3a63-9361-364490166e88.png[/img]
认证种类
[color=blue]1)基于HTTP认证[/color]
基于HTTP的认证使用username+password来认证一个user。该过程是由user发送一个没有认证口令的GET请求来请求某一个资源开始的。请求有Burp拦截,看起来如下:
[img]http://dl2.iteye.com/upload/attachment/0101/7567/74a9242f-aea2-39d3-978b-776f9e1ee86c.png[/img]
服务器然后在相应头发会“Authorization Required”消息。我们可以通过Wireshark来看到数据包。从header中可以看到,是“Basic”类型认证。浏览器识别出这个应答然后弹出一个请求username/password的对话框。注意对话框是由浏览器显示的而不是应用程序显示的。
[img]http://dl2.iteye.com/upload/attachment/0101/7573/ddc8e5b7-0f06-317f-aec4-959990a5f360.png[/img]
一旦我们输入username和密码,并且使用Burp再次拦截请求,我们可以获得如下结果。最后一行是“Authorization: Basic aW5mb3NlYzppbmZvc2VjaW5zdGl0dXRl”。这是在header中传输的额外信息。Basic后面的是关键信息。他们基本是编码后的口令。用户名和密码使用:连接,并且整体使用base64编码。例如username是“infosec”,密码是“infosecinstitute”然后整体“infosec:infosecinstitute”使用base64编码。服务器获取header的值,解码来获得口令,如果口令正确,那么可以获得访问权限。值得注意的是解密编码后的口令是很常见的事,所以它对于监听攻击非常脆弱。
[img]http://dl2.iteye.com/upload/attachment/0101/7575/f66e9420-cf87-3042-bf19-dd3f485decd8.png[/img]
Wireshark可以识别这个,并且自动解码字符串来获得口令。如下图
[img]http://dl2.iteye.com/upload/attachment/0101/7577/22d6c517-8d23-3e59-b84d-48e624dad79e.png[/img]
从Credentials部分我们可以看到,用户名和密码分别是“infosec”和“infosecinstitute”。基于HTTP认证的一个问题是数据是明文传输的。可以通过SSL来减少风险,SSL使用加密格式来发送数据,所以授权header中的数据不透明。然而,它仍然可以受到很多客户端的攻击,包括MITM.它也可以收到暴力破解攻击。
[color=blue]2)HTTP摘要认证[/color]
摘要认证被设计为基于HTTP认证的一个改善。一个明显的增强是数据不再是明文传送,而是加密格式。user首先发送一个没有任何口令的请求到相应页面。服务器返回一个WWW-Authenticate header来指明需要口令来访问资源。服务器同时发送一个随机值,叫“nonce”。浏览器然后使用一个加密函数来创建一个基于username,password,“nonce”,HTTP methods,和页面的url的摘要。这种情况下的加密函数是一个单向加密函数,意味着数字摘要只可以在一个方向上创建,不可以逆向来获得创建它时的那些信息。默认的,摘要认证使用MD5算法。
摘要访问认证比HTTP基本认证不容易受监听攻击,但是容易遭受重放攻击,例如如果客户端可以重放加密信息,server将会允许客户的访问。然而为了避免这种攻击,服务器的nonce有时包含时间戳。一旦server获得nonce,它检查nonce的属性以及时间是否超时,可能会拒绝访问请求。摘要访问认证的另一个好处是攻击者需要知道其他的四个值(username, nonce, url, http method)来使用字典或暴力破解。这个过程相对于简单的暴力破解更昂贵而且不易成功。
[color=blue]3)基于表单认证[/color]
基于表单认证使用一个包含允许user数据username和password的input标签的表单来进行认证。一旦user提供了信息,它通过HTTP/HTTPS的GET或POST方法来传送信息。在服务器端,如果口令正确,user被认证,对于相应的请求,一些随机token或sessionid返回。对于基于表单认证的一个好处是没有标准的加密username/password方法,所以高度定制化,因而对于HTML基本攻击和摘要认证攻击成功的方法对它可能免疫。基于表单认证攻击是目前web程序中最常用的认证方法。一些基于表单认证的问题是口令是明文传送的除非使用TLS。
来看一个基于表单攻击的例子。我们使用DVWA作为例子.
安全级别设置为高。我们可以看到表单接受username/password,去掉任意格式的特殊字符来避免SQL注入攻击,然后通过一个sql查询语句来确认口令是否正确。
[img]http://dl2.iteye.com/upload/attachment/0101/7585/3ecd1bac-0eb4-3830-bf6b-a15606984535.png[/img]
输入任何的username/password,使用Buip拦截:
[img]http://dl2.iteye.com/upload/attachment/0101/7587/4e19b42c-6a85-3e17-bb8b-d5f8976fc846.png[/img]
[color=blue]攻击Web认证[/color]
我们将会使用暴力破解来攻击High安全级别的DVWA表单认证。注意暴力破解可能不会成功。某些情况下,网站会在若干次失败尝试之后会拒绝你的请求。同时一些网站会使用CAPTCHA来识别发送请求的是否是一个人类。
我们使用Burp中的intruder来进行暴力破解。通常需要username/password来进行暴力破解。在表单中输入username/password,然后拦截请求。截获请求后,右击鼠标选择“send to intruder”。
[img]http://dl2.iteye.com/upload/attachment/0101/7589/5e59c4b0-6d9f-3f90-858d-8935776b48d9.png[/img]
这样会把请求信息发送到intruder。转到intruder标签,现在需要配置Burp来进行暴力破解攻击。在target标签中,我们可以看到target已被设置。
[img]http://dl2.iteye.com/upload/attachment/0101/7591/2b72eb51-22db-3c7a-9817-faf16b584256.png[/img]
现在转到position标签,这里我们可以看到之前我们发送intruder的请求。其中有一些东西被高亮,这些都是由Burp猜测的在每一个请求中可以变化从而用于暴力破解的部分。本例中只有username和password是可以变化的,我们只需进行相应的配置。
[img]http://dl2.iteye.com/upload/attachment/0101/7593/511c28b7-f8ed-348f-8f35-467fe8d733b8.png[/img]
点击clear按键。将会删除所有高亮的文本,现在我们只需要配置username和password来进行攻击。高亮请求中的username(本例中是“infosec”),然后点击Add。相似的,高亮password然后点击Add。这会使username和password变为第一/er个参数。此时输出应该如此。
[img]http://dl2.iteye.com/upload/attachment/0101/7599/7278de83-c410-31fa-92f4-9ef740c88e7a.png[/img]
然后我们需要设置攻击类型。默认设置为Sniper,然而在本例中我们将使用Cluster Bomb。Cluster Bomb的基本原理是使用多个payload组合(1 for username and 1 for the password)。攻击将会先使用payload1的所有值以及payload2的第一个值,然后使用payload1的所有值和payload2的第二个值。如下所示,我们的攻击类型是“Cluster Bomb”。
[img]http://dl2.iteye.com/upload/attachment/0101/7603/eb7c106c-d50b-3fb1-b7a7-9e0159faa5d8.png[/img]
转到payload标签,选择payload set 1,点击load来加载一个含有所有username的文件。如下:
[img]http://dl2.iteye.com/upload/attachment/0101/7605/0e4b3382-4399-376e-9d3f-a993241ceeab.png[/img]
相似,选择payload set 2,加载密码文件
转到option标签,选择result区域中的“store requests”和“store response”选项。检查相应设置
[img]http://dl2.iteye.com/upload/attachment/0101/7607/0a993124-fcc0-3afa-bba5-0c0b35491b81.png[/img]
现在可以开始攻击。点击intruder,然后点击“start attack”。将会看到一个弹出窗口,显示所有的请求。我们如何知道一个攻击是否成功?通常成功的响应和失败的响应会不同,或应答状态不同。本例中,我们可以看到admin/password的那组请求对应的应答与其他的应答相比长度不一样。
[img]http://dl2.iteye.com/upload/attachment/0101/7609/200a45ea-c846-33d8-8c5d-9ccc76034fe6.png[/img]
点击那个长度不同的应答。在response部分,我们可以看到在应答中含有“Welcome to the password protected area admin”文本。从而证明破解成功。
[img]http://dl2.iteye.com/upload/attachment/0101/7611/9503a367-b789-3c7a-a771-78dac09cefa1.png[/img]