提示:原创 请勿转载
前言
提示:学习代码,写的不对请纠正,见谅:
python 简单的扫描器,实现了扫描目标网址的ip,端口,识别中间件,目录
主要用到了 python的 requests、socket 、threading模块
此博客只会写主要的实现函数和简单的对代码进行解释,完全的代码在github上
源代码github地址:https://github.com/XYFAE/pythonscanner
一、构思
先要构思好要实现的功能和要用到的模块
比如扫描端口要用到的socket模块,扫描目录要用到的requests模块
二、使用步骤
1.引入库
代码如下(示例):
import requests #爬虫模块
import sys
import socket #网络连接模块
import threading #线程模块
from tqdm import tqdm #进度条
import time # 可以控制扫描速度
2.实现函数
这里先把线程要调用的函数写出来,方便后面使用多线程
代码如下(示例):
def portscanner(host, port): #扫描端口
global openNum #global python的一个用法,设置全局变量
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #设置socket初始化
s.connect((host, port))
lock.acquire() #修改前加一把锁
openNum += 1
list1.append("{} open".format(port))
lock.release() #修改完释放锁
s.close()
except:
pass
def dirscanner(url,i): #扫描目录
global opendir
#判断url最后一个字符是否为/ 没有则加上
try:
if url[-1] != '/':
url = url + '/'
newurl = url + i.strip('\n')
r = requests.get(newurl, headers=headers)
if r.status_code == 200:
lock.acquire()
list2.append("{} open".format(newurl))
opendir += 1
lock.release()
except:
print("GG")
pass
开启线程池
lock = threading.Lock() # 确保 多个线程在共享资源的时候不会出现脏数据
openNum = 0 # 端口开放数量统计
opendir = 0 # 目录开放数量统计
threads = [] # 线程池
通过socket获取服务器ip
print(colors.OKGREEN+"Status_code is: 200"+colors.ENDC)
r1 = requests.get(url, headers=headers)
ip = socket.gethostbyname(url.replace("http://","").replace("https://","").replace("/",""))
print('IP:', ip)
多线程的端口扫描使用
目录扫描同理,注意打开文件和遍历文件的功能在实现函数(postscanner)外
for port in tqdm(ports,colour='blue'):
t1 = threading.Thread(target=portscanner, args=(ip, port))
threads.append(t1)
t1.start()
# time.sleep(0.25)
for t1 in threads:
t1.join() #让主进程等待子进程结束才继续走后续的逻辑
print("端口开放列表为:")
for i in list1:
print(colors.OKGREEN+i+colors.ENDC)
time.sleep(0.1)
print(f"PortScan is Finish ,OpenNum is {openNum}")
总结
一个简单的扫描器,学习任重而道远,路漫漫其修远兮~
源代码在github上哦