【网络安全】「漏洞扫描」(一)基于自定义协议的特定设备扫描器

前言

本篇博文是《从0到1掌握安全测试》中「漏洞扫描」系列的第一篇博文,主要内容是介绍一种基于自定义协议的局域网特定设备扫描器,它可以自动扫描给定 IP 地址段内的特定设备,并进行登录验证、获取连接用户信息,最终输出相关结果,往期系列文章请访问博主的 安全测试工具和技术:从漏洞扫描到渗透测试 专栏;

功能介绍

基于自定义协议,编写一个局域网内的特定设备扫描器,主要功能如下:

  1. 支持命令行输入,内容包括 IP 地址段,用户名、密码;

  2. 在 IP 地址段内探测特定设备,如果是特定设备,则进行验证登录;

  3. 获取特定设备上所有的用户连接;

  4. 最终输出特定设备如下信息:

    IP 登录是否成功 所有用户连接
    

思路分析

1、使用 input()optparse() 获取命令行输入;

2、循环遍历该 IP 网段的所有地址,使用 socket 进行探测,以确保端口开放,需要注意的是,http 的默认开放端口是 80,https 的默认开放端口是 443

3、设计 WebClient 类,使得我们可以对开放的端口进行登录验证并获取用户列表;

4、最后格式化结果,输出到控制台或者日志当中;

协议说明

使用自定义协议进行登录时,客户端需要向服务端发送两次登录请求通信:

  • 第一次的登录请求需要包含用户名,客户端类型,登录类型等参数,由于第一次请求是与服务器进行认证沟通,因此不需要填写密码;服务端会返回认证信息和加密方式,客户端根据这些信息对明文密码进行加密;
  • 第二次的登录请求除了需要包含第一次的请求参数之外,还需要添加加密过的密码;服务端会返回唯一身份凭证,在之后的接口调用中会以此作为依据;

自定义协议图解如下所示:

协议图解.png

WebClient 类设计

1、根据协议内容和参数,构造第一次请求:

req_json = {


    "method": "...",


    "params": {
        "userName": self.username,
        "password": "",
        "clientType": "...",
        "loginType": "...",
    },
    "id": self.id
}
resp_header, resp_json = self.conn.request(self.url, method="POST", body=json.dumps(req_json))

在上述代码中,根据协议构造请求体,由于第一次登陆请求是与服务器进行认证沟通,因此不需要输入密码;

2、从返回值中获取第二次登陆请求所需要的参数,比如随机字符串 random 、加密方式 encryption 和认证信息 authorization 等:

resp_json = json.loads(resp_json)
if "params" in resp_json.keys():
    self.random = resp_json["params"].get("random", None)
    self.encryption = resp_json["params"].get("encryption", "Default")
    ...
    self.authorization = resp_json["params"].get("authorization", None)
self.sessionId = resp_json["session"]

3、第二次登陆请求时,需要对密码进行鉴权加密,以摘要加密方式为例:

encrypted-passwd = MD5(username-value:random:passwd-value)
final-passwd = SHA1(random:encrypted-passwd:authorization)

上述加密方式中,几个参数的解释如下:

  • username-value 为用户名;
  • passwd-value 为密码明文;
  • random 为服务器返回的随机字符串;
  • encrypted-passwd 为加密后的密码;
  • authorization 为服务器返回的认证信息;

4、构造第二次登陆请求:

req_json = {


    "method": "...",


    "session": self.sessionId,
    "params": {
        "userName": self.username,
        "password": final-passwd,
        "clientType": "...",
        "loginType": "...",
    },
    "id": self.id
}

resp_header, resp_json = self.conn.request(self.url, method="POST", body=json.dumps(req_json))

5、获取用户信息也是类似的,携带 session 去请求接口即可:

req_json = {


    "method": "...",


    "params": {...},
    "id": self.id,
    "session": self.sessionId
}
resp_header, resp_json = self.conn.request(self.url, method="POST", body=json.dumps(req_json))

运行结果

image.png

后记

总之,基于自定义协议的特定设备扫描器是一种功能强大的工具,可以帮助网络管理员更轻松地管理局域网中的特定设备。通过自动扫描和登录验证,该扫描器可以获取设备的详细信息,帮助管理员更好地了解网络的状态和安全状况。

? 上篇精讲:这是第一篇,没有上一篇喔~

? 我是 ??????,期待你的关注,创作不易,请多多支持;

? 公众号:sidiot的技术驿站

? 系列专栏:安全测试工具和技术:从漏洞扫描到渗透测试项目实战

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYu8nnzV' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片