python多线程在渗透测试中的应用
难易程度:★★★
阅读点:python;web安全;
文章作者:xiaoye
文章来源:i春秋
关键字:网络渗透技术
前言
python是门简单易学的语言,强大的第三方库让我们在编程中事半功倍,今天,我们来谈谈python多线程在渗透测试中的应用,本文,我们将编写一个简易c段存活主机扫描脚本,以及一个python版本的多线程御剑--目录扫描工具
一、python 多线程
python多线程有几种写法
1. thread模块
python的一个多线程模块,小脚本可以用,但是有瑕疵,比如不稳定,线程数不好控制
下方贴出一个c段存活主机扫描脚本,这个脚本i春秋ado老师也有教过哦
思想:输入一个ip,经过字符拆分,获取c段,多线程地ping -c 2 ip ,根据返回的信息来判断主机是否存活
demo ping_thread.py:
'''
Created on -- @author: xiaoye
'''
#coding: utf-
import thread
import time
from subprocess import Popen,PIPE def scan_ip(ip):
process = Popen('ping -c 2 ' + ip, stdin=PIPE, stdout=PIPE, shell=True)
data = process.stdout.read()
if 'ttl' in data:
print '%s is live ,now time is %s' % (ip, time.strftime('%H:%M:%S')) if __name__ == '__main__':
#scan_ip('111.13.147.229')
ips = raw_input()
ip_header = '.'.join(ips.split('.')[:])
for i in range(,):
ip = ip_header + '.' + str(i)
#print ip
thread.start_new_thread(scan_ip, (ip,))
time.sleep(0.1)
运行情况:
速度还行,稳定性一般
thread模块,核心在:
1
2
|
thread.start_new_thread(scan_ip, (ip,)) time.sleep( 0.1 ) |
scan_ip是要执行的函数,(ip,)是传入的参数,记得sleep一下
2.threading模块用法:
demo:
'''
Created on --
@author: xiaoye
'''
#coding: utf-
import threading
import time def test(th):
print 'i am doing %s %s' % (th, time.strftime('%H:%M:%S')) def main():
thread = []
keys = ['movie_th','swim_th','listen_th','learn_th','movie_th','swim_th','listen_th','learn_th','movie_th','swim_th','listen_th','learn_th','movie_th','swim_th','listen_th','learn_th']
thread_count = len(keys)
#print thread_count
for i in range(thread_count):
t = threading.Thread(target=test, args=(keys[i],))
thread.append(t)
for i in range(thread_count):
thread[i].start()
for i in range(thread_count):
thread[i].join() if __name__ == '__main__':
main()
运行情况:
可以看到,基本是同时运行的,threading.Thread模块的一种用法就是这样:
for i in range(thread_count):
t = threading.Thread(target=test, args=(keys[i],))
thread.append(t)
for i in range(thread_count):
thread[i].start()
for i in range(thread_count):
thread[i].join()
模式1.:一个列表存放所有线程,start()执行列表中线程,join()等待运行完毕
模式1?,还有模式2吗?
当然,模式2就是从threading.Thread继承一个子类class,重写父类run方法,实现多线程运行run函数,而这种也是非常良好的写法
demo:
# -*- coding: utf- -*-
import threading class T(threading.Thread): def __init__(self):
threading.Thread.__init__(self) def run(self): #继承,threading.Thread子类, 重写run方法, run方法在start()后自动执行
print 'i love you' def main():
thread = []
for i in range():
thread.append(T())
for i in thread:
i.start()
for i in thread:
i.join() if __name__ == '__main__':
main()
运行情况:
二、线程间的数据守护
Queue绝对是保护线程间数据安全的好选择,有关于Queue,大家可以自行百度其用法,我发出一点经常用的:
Queue.qsize() 返回队列的大小
Queue.empty() 如果队列为空,返回True,反之False
Queue.full() 如果队列满了,返回True,反之False
Queue.full 与 maxsize 大小对应
Queue.get([block[, timeout]]) 获取队列,timeout等待时间
Queue.get_nowait() 相当Queue.get(False)
非阻塞 Queue.put(item) 写入队列,timeout等待时间
Queue.put_nowait(item) 相当Queue.put(item, False)
Queue.task_done() 在完成一项工作之后,Queue.task_done() 函数向任务已经完成的队列发送一个信号
Queue.join() 实际上意味着等到队列为空,再执行别的操作
三、多线程threading.Thread+Queue实现渗透测试工具编写
脚本放出来:
1.多线程c段存活主机扫描:
'''
Created on --
@author: xiaoye
'''
#coding: utf-
import time
import sys
import threading
import Queue
from subprocess import Popen,PIPE class Quethread(threading.Thread):
def __init__(self, que):
threading.Thread.__init__(self)
self._que = que def run(self):
while not self._que.empty():
ip = self._que.get()
process = Popen('ping -c 2 ' + ip, stdin=PIPE, stdout=PIPE, shell=True)
data = process.stdout.read()
if 'ttl' in data:
sys.stdout.write('%s is live %s\n' % (ip, time.strftime('%H:%M:%S'))) def main():
que = Queue.Queue()
ips = raw_input()
thread = []
thread_count =
ip_head = '.'.join(ips.split('.')[:])
#print ip_head
for i in range(, ):
que.put(ip_head + '.' + str(i))
'''for i in range(1,255):
print que.get()''' for i in range(thread_count):
thread.append(Quethread(que)) for i in thread:
i.start() for i in thread:
i.join() if __name__ == '__main__':
main()
ubuntu下运行成功,win下需要修改Popen里的命令等,截图:
速度很快,稳定性较强
c段主机存活脚本:https://github.com/xiaoyecent/ping_threading_Queue
2.py版多线程御剑--目录扫描--支持自定义字典、输出文件位置以及自定义线程数:
'''
@author: xiaoye
'''
#coding: utf-
import requests
import sys
import threading
#import time
import Queue
from optparse import OptionParser reload(sys)
sys.setdefaultencoding('utf8') class Doscan(threading.Thread):
def __init__(self, que):
threading.Thread.__init__(self)
self._que = que def run(self):
while not self._que.empty():
d = self._que.get()
try:
r = requests.get(url + d, headers=headers, timeout=)
sys.stdout.write(d + ' is scan status:' + str(r.status_code) + '\n')
if r.status_code == :
with open(option.outfile, 'a') as f:
f.write(url + d + '\n')
except:
pass def main():
thread = []
thread_count = option.threadcount
que = Queue.Queue() with open(option.dictname, 'r') as f:
for d in f.readlines():
d = d.strip('\n')
que.put(d) for i in range(thread_count):
thread.append(Doscan(que)) for i in thread:
i.start() for i in thread:
i.join() if __name__ == '__main__':
parse = OptionParser()
parse.add_option('-u', '--url', dest='input_url', type='string', help='the url you wan to scan dir')
parse.add_option('-o', '--out', dest='outfile', type='string', help='output filename', default='result.txt')
parse.add_option('-s', '--speed', dest='threadcount', type='int', default=, help='the thread_count')
parse.add_option('-d', '--dict', dest='dictname', type='string', help='dict filename')
(option, args) = parse.parse_args()
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0'}
url = option.input_url
main()
Usage: scan_dir.py [options] Options:
-h, --help show this help message and exit
-u INPUT_URL, --url=INPUT_URL
the url you wan to scan dir
-o OUTFILE, --out=OUTFILE
output filename
-s THREADCOUNT, --speed=THREADCOUNT
the thread_count
-d DICTNAME, --dict=DICTNAME
dict filename
参数用法贴出来
运行情况
举个例子:
-u http://localhost -s 30 -d d://PHP.txt -o d://ichunqiu.txt:
结果:
运行速度取决于线程数(默认60)和实际环境
源码:https://github.com/xiaoyecent/scan_dir
四、总结
多线程加队列实现线程间的数据保护是很好的搭配,threading.Thread+Queue的用法希望大家能够掌握,另外,继承threading.Thread写出子类,重写父类run方法来实现多线程的写法也值得借鉴
python多线程在渗透测试中的应用的更多相关文章
- 详述MySQL服务在渗透测试中的利用
本文作者:i春秋签约作家——Binghe 致力于书写ichunqiu社区历史上最长篇最细致最真实的技术复现文章. 文章目录: MySQL之UDF提权 MySQL之MOF提权 MySQL之常规写启动项提 ...
- 反向代理在Web渗透测试中的运用
在一次Web渗透测试中,目标是M国的一个Win+Apache+PHP+MYSQL的网站,独立服务器,对外仅开80端口,网站前端的业务系统比较简单,经过几天的测试也没有找到漏洞,甚至连XSS都没有发现, ...
- Windows-NTFS-ADS在渗透测试中的利用
0.什么是ADS Windows:微软公司的一款视窗操作系统,其内核为WindowsNT. NTFS:WindowsNT环境的限制级专用文件系统. ADS:NTFS的系统特性,交换数据流(Altern ...
- 渗透测试中的bypass技巧
0x00 前言 许多朋友在渗透测试中因为遇到WAF而束手无策,本人应邀,与godkiller一同写下此文,希望能够对许多朋友的问题有所帮助. 此系列一共分为五篇文章,分别如下: 一.架构层绕过WAF ...
- Windows渗透测试中wmi的利用
0x01 关于WMI WMI可以描述为一组管理Windows系统的方法和功能.我们可以把它当作API来与Windows系统进行相互交流.WMI在渗透测试中的价值在于它不需要下载和安装, 因为WMI是W ...
- WMI在渗透测试中的重要性
0x01 什么是wmi WMI可以描述为一组管理Windows系统的方法和功能.我们可以把它当作API来与Windows系统进行相互交流.WMI在渗透测试中的价值在于它不需要下载和安装, 因为WMI是 ...
- 详述MSSQL服务在渗透测试中的利用(上篇)
前言: 致力于复现最实用的漏洞利用过程. 本文将带领大家学习以下内容: 学习使用`xp_cmdshell`扩展存储过程 学习调用`wscript.shell` 学习MSSQL写文件 学习沙盘模式提权 ...
- 渗透测试中如何科学地使用V*P*N
环境说明 Windows7 虚拟机,作为VPN网关,负责拨VPN.VPN可以直接OPENVPN,也可以使用ShadowSocks+SSTap. Kali 虚拟机, 渗透测试工作机 配置步骤 Windo ...
- MySQL在渗透测试中的应用
原文地址:https://xz.aliyun.com/t/400 前言作为一个安全爱好者你不可能不知道MySQL数据库,在渗透过程中,我们也很经常遇到MySQL数据库的环境,本文就带大家了解MySQL ...
随机推荐
- c# post方法亲测可用
/// <summary> /// Post接口方法 /// </summary> /// <param name="requestUri">& ...
- git安装包解压后没有configure
今天在linux上安装git客户端,解压了tar包后,发现没有configure,无法安装.经查,原来是要先执行autoconf命令,执行后出现configure
- devexpress总结 accordionControl 加载panelcontrol 的快捷方式
先说保存: UserControl control; private void barButtonItem1_ItemClick(object sender, DevExpress.XtraBars. ...
- centos7 安装mysql5.7.20(yum方式)
windows下安装mysql请访问:windows下mysql5.7.20安装(zip包方式) 一.安装过程 1.安装wget yum install wget 2.查找yum源名称 在mysql官 ...
- Convolutional LSTM Network: A Machine LearningApproach for Precipitation Nowcasting
Convolutional LSTM Network: A Machine LearningApproach for Precipitation Nowcasting 这篇文章主要是了解方法. 原始文 ...
- python基础之Day24
1.补充内置函数 2.反射 什么是? 通过字符串操作类或者对象的属性 hasattri(a,"b") 判断能否访问到a.b setattri(a,"b",c) ...
- python基础之Day22
1.组合 什么是? 一个类的对象具备某一个属性,该属性值属于另一个类的对象,这样就可以引用 为何用: 解决类与类之间代码冗余问题 如何用? 2.菱形继承 单继承:一个个往父类上查找 菱形:一个子类继承 ...
- sparse_matrix
(1)ndarray 与 scipy.sparse.csr.csr_matrix 的互转 import numpy as npfrom scipy import sparse 1.1 ndarry 转 ...
- java之路 数据类型-常量
class Demo1{ public static void main(String[] args){ //数据类型 类名 = 初始值 int age = 10; int age1 = 20; Sy ...
- 本地iis新建站点步骤
例如:1.在C:\Windows\System32\drivers\etc\hosts下添加地址 2.在下面IIS加上名称与webUI的地址