0x00:简介
banner 信息来表示欢迎语,其中会包含一些敏感信息,所以获取 banner 也属于信息搜集的范畴。在渗透测试中,典型的 4xx、5xx 信息泄露就属于 banner 泄露的一种。在 banner 信息中,可以获取到软件开发商、软件名称、服务类型、版本号等。而版本号有时候就会存在公开的 CVE 问题,可以直接进行利用。
banner 信息获取的基础是在和目标建立链接后的,只有建立的链接,才可以获取到相应的 banner 信息,当目标对 banner 信息进行隐藏或者配置了禁止读取时,这时的 banner 则获取不到。
0x01:程序
于是乎,我们可以写一个小脚本扫描服务器的banner信息,以获取有用的信息。
from socket import *
from concurrent.futures import ThreadPoolExecutor,as_completed
host=input('输入ip')
def scan(port):
sock= socket(AF_INET,SOCK_STREAM)
try:
sock.settimeout(5)
sock.connect((host,port))
sock.send('hello\r\n'.encode())
result=sock.recv(1024)
print(result.decode())
except Exception as e:
print(e)
finally:
sock.close()
def main():
with ThreadPoolExecutor(max_workers=int(input('设置线程数'))) as t:
job_list = []
for port in range(int(input('起始端口')),int(input('结束端口'))):
obj = t.submit(scan,port)
job_list.append(obj)
if __name__=='__main__':
main()
0x02:解释
网上抄的:说一下细节,首先是 socket.socket 的参数,第一个参数是输入地址类型,第二个是输入套接字类型。socket.AF_INET 是用于服务之间的网络通信。socket.SOCK_STREAM 是用于 TCP,这两个参数的选择项如下:
第一个地址类型:
socket.AF_UNIX:用于 Unix 系统进程间的通信。
socket.AF_INET:服务器之间的网络通信。
socket.AF_INET6:使用 IPv6 进行通信。
第二个套接字类型:
socket.SOCK_STREAM:流式的 socket,用于 TCP。
socket.SOCK_DGRAM:数据包式的 socket,用于 UDP。
而经常组合用到的有两种,一种是 TCP 的 socket,一种是 UDP 的 socket,他们分别如下:
TCP:socket.socket(socket.AF_INET,socket.SOCK_STREAM)
UDP:socket.socket(socket.AF_INET,socket.SOCK_DGRAM)