通过上一篇网络编程基础-,大家对socket有了一定的认知,
本文整理的是对ip地址扫描,找出开放的端口,以及对域名的解析方法整理

任何工具的开发,一定是有需求才会去做
像是站长工具这一类的端口扫描工具是怎么做的呢?

wireshark扫描端口 socket扫描端口_端口号


其实很简单! 利用Socket就可以完成,而且效果要比它来的更好一些

话不多说,下面开始步入正题

需求:
1、对ip地址进行扫描,看地址是否有效,并在一定范围内找出未被占用的端口号
2、解析域名
3、工具整合,用户可以自主选择1-2来使用

需求点一:对ip地址进行扫描,看地址是否有效,并在一定范围内找出未被占用的端口号

import socket
import re
def check_ip(ip):  #利用正则,判断输入的ip是否符合规则

    """
    :return: 是否符合规则
    """
    ip_address = re.compile('((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}') #正则表达式对象
    if ip_address.match(ip) and len(ip)!=0: #满足ip规则,并且是有数值的为True,否则为False
        return True
    else:
        return False
        
def scan_port(ip): # 对传入的ip地址,在一定范围内扫描开放的端口,并打印
    #取出范围值
    port_begin,port_end = (1971,1991)
    for oen in range(int(port_begin),int(port_end)+1):
        # 使用 ip  实现tcp连接   
        # AF_INET家族包括Internet地址,AF_UNIX家族用于同一台机器上的进程间通信
        sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sk.settimeout(0.5)  # 设置延迟5s
        #访问成功是由返回值:是0
        conn = sk.connect_ex((ip,oen)) # 有返回值
        if conn ==0:
            print(f'主机:{ip},端口:{oen}已开放')
        else:
            pass
        sk.close()
        
def scan_ip():  # 用户输入ip,并对整体需求点一进行整合
    ip = input('请输入需要扫描的ip>>>')
    #2- 使用ip判断函数--判断
    if check_ip(ip):# 调用check_ip方法,返回True时,走到这里
        # 进入扫描端口 
        scan_port(ip)
    else:
        print("ip格式有误,请检查!")

需求点二:解析域名

def domain_name_scan():
    #1- 输入域名
    domainName = input('请输入域名>>>')
    #2- 可以做域名判断
    if "http://" in domainName or "https://" in domainName:
        domainName = domainName[domainName.find("://")+3:]  # 取前后下标
        print("正在解析的域名>>>",domainName)
    # 3- 获取ip
    server_ip = socket.gethostbyname(domainName) # socket 自带的解析域名方法,返回ip
    print(f"该域名{domainName}的ip>>>{server_ip}")
    # 4- 进入扫描端口
    scan_port(server_ip)

需求点三:工具整合,用户可以自主选择1-2来使用

def main():
    info = """
        1.使用IP扫描
        2.使用域名扫描
    """
    print(info)
    #2- 接收用户输入
    select = input("请选择>>>  ")
    if select =="1":
        # ip扫描
        scan_ip()
    elif select =="2":
        #域名扫描
        domain_name_scan()
    else:
        print("输入有误!")
if __name__ == '__main__':
    main()

方法调用

IP扫描

wireshark扫描端口 socket扫描端口_ip地址_02

域名扫描

wireshark扫描端口 socket扫描端口_端口号_03


在测试工作中,安全测试就需要用到这一类的工具,因为需要扫描有哪些端口是不该开放的,存在安全隐患的端口,就可以通过工具对其扫描,并及时规避问题。

但工具肯定不会这么简陋,这个只能当作入门~

有问题及时沟通,大家一起进步