Python编写端口扫描器

该博客介绍了如何使用Python编写一个TCP端口扫描器,通过socket模块进行网络连接,扫描目标主机上的指定端口,识别开启的服务。扫描器采用多线程提高扫描速度,并展示了与masscan工具的对比结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

常见端口:

端口服务
21默认是ftp端口,主要看是否支持匿名,也可以跑弱口令
22默认是shh端口
23默认是telnet端口
25默认是smtp服务
53默认是DNS
123NTP
161,162,8161snmp服务(8161 IBM以款产品开放的SNMP)
389ldap团体
80http服务
443https服务
512,513rlogin服务或者是exec
873rsync 主要是看是否支持匿名,也可以跑弱口令
1433mssql数据库
1080socks代理
1521oracle数据库
1900bes默认后台
2049nfs服务
2601,2604zebra路由,默认密码zebra
2028,2083cpanel主机管理系统
3128,3312squid代理默认端口,如果没设置口令很可能就直接漫游内网了
3306mysql数据库
4899R-admin连接端
4440rundeck 参考WooYun:借用新浪某服务成功漫游新浪内网
8834nessus服务
4848glashfish
3311,3312kangle主机管理系统
3389远程登录
5672rabbitMQ
5900VNC
6082varnish 参考WooYun:Varnish HTTP accelerator CLI未授权访问易导致网站直接篡改或者作为代理进入内网
6379redis 一般无认证,可直接访问
7001weblogic
8080tomcat
8089jboss
8161activeMQ
8649ganglia集群系统监控软件
9000fastcgi服务
9090IBM服务
9200,9300elasticsearch 参考WooYun:多玩某服务器ElasticSearch命令执行漏洞
9999amg加密版
10050zabbix
11211memcache未授权访问
27017,28017mongodb未授权访问,默认无口令登录
3777大华监控设备
50000sap netweaver远程命令执行漏洞

编写自己的TCP端口扫描器,利用TCP全连接扫描来识别主机,首先导入socket模块:
socket.gethostbyname(hostname):将主机名换为IP地址;
socket.gethostbyaddr(ip_address):传入一个IP地址返回一个元组,其中包含主机名,别名列表和同一接口的IP地址列表;
socket.socket([family[,type[,proto]]]):将产生一个新的socket,通过给定的socket地址簇和socket类型,地址簇可以是AF_INET(默认),AF_INET6或者是AF_UNIX,另外,socket类型可以为一个TCP套接字即SOCK_STREAM(默认),或者是UDP套接字即SOCK_DGRAM,或者其他的套接字类型。最后协议号通常为零,再大多数情况下省略不写。
socket.connect(address):连接到address处的套接字。一般address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。
socket.connect_ex(adddress):功能与connect(address)相同,但是成功返回0,失败返回error的值。

第一步要输入目标主机名和要扫描的端口列表。然后通过目标主机名得到目标的网络IP地址。用列表里的每一个端口取连接目标地址,最后确定端口上运行的特殊服务。最后将发送特定数据,并读取特定应用程序返回的标识。帮助信息确定完之后,需要对特定端口和主机进行socket连接,最终查看端口连接状态。使用多线程的方式来提升速度。

源代码如下
import optparse
import socket
import threading
import re

screenLock = threading.Semaphore(value=1)


def connScan(tgtHost, tgtPort):
    try:
        connSkt = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        result = connSkt.connect_ex((tgtHost, tgtPort))
        # connSkt.send(b'test')
        # results = connSkt.recv(100)
        screenLock.acquire()
        if (result == 0):
            print('[+] {0}:{1} /tcp open'.format(tgtHost, tgtPort))
        # else:
        #     print('[-] %d/tcp closed' % tgtPort)
        # print('[-] ' + str(results))
        # connSkt.close()
    except:
        screenLock.acquire()
        print('[-] error')
    finally:
        screenLock.release()
        connSkt.close()


def portScan(tgtHost, tgtPorts):
    try:
        tgtIP = socket.gethostbyname(tgtHost)
    except Exception as e:
        print("[-] Cannot resolve '%s':Unknown host" % tgtHost)
        return
    # try:
    # tgtName = socket.gethostbyaddr(tgtIP)
    # print('\n[+]Scan Results for '+tgtName[0])
    # except:
    print('\n[+] Scan Results for ' + tgtIP)
    socket.setdefaulttimeout(1)
    for tgtPort in tgtPorts:
        # print('[+] Scaningport' + str(tgtPort))
        t = threading.Thread(target=connScan, args=(tgtHost, int(tgtPort)))
        t.start()
        # connScan(tgtHost,int(tgtPort))


def main():
    parser = optparse.OptionParser('usage %prog -H <target host> -p <target port>')
    parser.add_option('-H', dest='tgtHost', type='string', help='specify target host')
    parser.add_option('-p', dest='tgtPort', type='string', help='specify target port')
    (options, args) = parser.parse_args()
    tgtHost = options.tgtHost
    tgtPort = options.tgtPort
    if '-' in tgtPort:
        Ports = re.findall(r'[0-9]{1,5}', tgtPort)
        first = int(Ports[0])
        last = int(Ports[1])
        for i in range(first, last + 1):
            args.append(i)
    else:
        args.append(int(tgtPort))
    if (tgtHost == None) | (tgtPort == None):
        print('[-] You must specify a target host and port[s]!')
        exit(0)
    portScan(tgtHost, args)


if __name__ == '__main__':
    main()

运行结果与masscan对比:
在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值