前言
本篇博文是《从0到1掌握安全测试》中「漏洞扫描」系列的第一篇博文,主要内容是介绍一种基于自定义协议的局域网特定设备扫描器,它可以自动扫描给定 IP 地址段内的特定设备,并进行登录验证、获取连接用户信息,最终输出相关结果,往期系列文章请访问博主的 安全测试工具和技术:从漏洞扫描到渗透测试 专栏;
功能介绍
基于自定义协议,编写一个局域网内的特定设备扫描器,主要功能如下:
-
支持命令行输入,内容包括 IP 地址段,用户名、密码;
-
在 IP 地址段内探测特定设备,如果是特定设备,则进行验证登录;
-
获取特定设备上所有的用户连接;
-
最终输出特定设备如下信息:
IP 登录是否成功 所有用户连接
思路分析
1、使用 input()
或 optparse()
获取命令行输入;
2、循环遍历该 IP 网段的所有地址,使用 socket
进行探测,以确保端口开放,需要注意的是,http 的默认开放端口是 80,https 的默认开放端口是 443;
3、设计 WebClient 类,使得我们可以对开放的端口进行登录验证并获取用户列表;
4、最后格式化结果,输出到控制台或者日志当中;
协议说明
使用自定义协议进行登录时,客户端需要向服务端发送两次登录请求通信:
- 第一次的登录请求需要包含用户名,客户端类型,登录类型等参数,由于第一次请求是与服务器进行认证沟通,因此不需要填写密码;服务端会返回认证信息和加密方式,客户端根据这些信息对明文密码进行加密;
- 第二次的登录请求除了需要包含第一次的请求参数之外,还需要添加加密过的密码;服务端会返回唯一身份凭证,在之后的接口调用中会以此作为依据;
自定义协议图解如下所示:
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))
运行结果
后记
总之,基于自定义协议的特定设备扫描器是一种功能强大的工具,可以帮助网络管理员更轻松地管理局域网中的特定设备。通过自动扫描和登录验证,该扫描器可以获取设备的详细信息,帮助管理员更好地了解网络的状态和安全状况。
? 上篇精讲:这是第一篇,没有上一篇喔~
? 我是 ??????,期待你的关注,创作不易,请多多支持;
? 公众号:sidiot的技术驿站;
? 系列专栏:安全测试工具和技术:从漏洞扫描到渗透测试,项目实战;