Back
Featured image of post Python端口扫描等

Python端口扫描等

Python端口扫描以及相关概念理解

思路

这里使用了TCP连接扫描,利用操作系统原生的网络功能。

用户无需特殊权限,但因为建立了TCP连接,很容易被发现,而且会留下IP地址。

还有另外一种扫描方式是SYN扫描,端口扫描工具不使用操作系统原生网络功能,而是自行生成、发送IP数据包,并监控其回应。这种扫描模式被称为“半开放扫描”,因为它从不建立完整的TCP连接。端口扫描工具生成一个SYN包,如果目标端口开放,则会返回SYN-ACK包。扫描端回应一个RST包,然后在握手完成前关闭连接。如果端口关闭了但未使用过滤,目标端口应该会持续返回RST包。这种粗略的网络利用方式有几个优点:给扫描工具全权控制数据包发送和等待回应时长的权力,允许更详细的回应分析。关于哪一种对目标主机的扫描方式更不具备入侵性存在一些争议,但SYN扫描的优势是从不会建立完整的连接。然而,RST包可能导致网络堵塞,尤其是一些简单如打印机之类的网络设备。

1.使用TCP握手连接来扫描指定的(ip,port)

2.将单线程改成多线程

3.第一次使用面向对象编程

源码

说白了就是调接口,然后加了个多线程……

import socket
import threading
ip = "82.157.174.226"
post_list = [i for i in range(1,65536)]
output = [0 for i in range(1,65536)]
delay = 1
lock = threading.Semaphore(150)
class MyThread(threading.Thread):
    def __init__(self, ip, port_number, output, delay):
        self.ip = ip
        self.port_number = port_number
        self.output = output
        self.delay = delay
        threading.Thread.__init__(self)

    def run(self):
        if lock.acquire():
            #初始化socket,参数1是ipv4,参数2是TCP
            TCP_sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
            #设置参数,参数1表示我们正在使用的socket选项,参数2表示支持多个进程或者线程绑定到同一端口
            TCP_sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
            #设置超时等待时间,单位秒
            TCP_sock.settimeout(self.delay)

            # UDP_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
            # UDP_sock.sendto(str(message), (ip, int(port_number)))

            try:
                result = TCP_sock.connect_ex((ip, int(self.port_number)))

                if result == 0:
                    output[self.port_number] = 'OPEN'
                    print(str(self.port_number) + ":" + output[self.port_number])
                else:
                    output[self.port_number] = 'CLOSE'

                    TCP_sock.close()
                
            except socket.error as e:
                output[self.port_number] = 'error'
                #print(str(self.port_number) + ":" + output[self.port_number])
                pass 

            lock.release()

ThreadList = []
for i in post_list:
    t = MyThread(ip, i, output, delay)
    ThreadList.append(t)
for t in ThreadList:
    t.start()
for t in ThreadList:
    t.join()
for i in output:
    if output[i] !='CLOSE':
        print("PORT:" + str(i) + ":" + output[i])

其他

对handle的理解

首先在 PowerShell 中获取进程信息并以程序 ID 进行排序,第一列出现handles。

PS C:\Users\Lenovo> Get-Process | Sort-Object ID

Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
-------  ------    -----      -----     ------     --  -- -----------
      0       0       60          8                 0   0 Idle
   8174       0       48        148                 4   0 System
      0      16    14708      62260               160   0 Registry
    430      17     4216      21944       2.11    480   1 RuntimeBroker
     57       3     1068       1160               556   0 smss
   2019      30    10004      24904               596   0 lsass
    904      12     6616      10796               604   0 services
    245      29    24792      11608               616   0 PresentationFont...
    154      10     1804       6648               848   0 svchost

在代码里,handle 通常是某个数字标记,通过这个标记来操作资源。

是否可以简单把Handles理解为Id?不好。 首先分配16位的标记,再用 8 位密码将 16 位标记加密,之后将 4 位类型、4 位权限、8 位密码、16 位加密结果打包成一个 32 位的整数,这时再简单理解的Handles为索引,就不恰当。

对socket的理解

TCP/IP只是一个协议栈,如果想要有具体的应用,就需要提供对外的操作接口,就像操作系统会提供标准的编程接口,TCP/IP也必须对外提供编程接口,这就是Socket。

现在我算明白了socket和http的区别:

对概念来说:

Http协议:基于TCP连接的简单的对象访问协议,对应于应用层。

Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。

对一次连接过程而说:

Http连接:所谓的无状态连接,客户端向服务器发送一次请求,服务器进行一次回应就断开。

SOCKET连接:长连接,(如果期间没有数据的传输,会发送心跳包确认。)

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy
© Licensed Under CC BY-NC-SA 4.0