使用C#winform编写渗透测试工具--端口扫描
使用C#winform编写渗透测试工具--端口扫描器
主要介绍使用C#winform编写渗透测试工具--端口扫描器,端口扫描器则是一种检测服务器或者主机虚拟端口是开启或关闭的工具。由于连接到局域网或互联网的计算机运行着不同服务,端口的存在允许同一台计算机上的不同应用程序同时共享网络资源。端口的范围为0到65535,0到1023的端口数最常用,它们中有许多是为FTP、SS-H、HTTP、telnet和DNS等服务保留的,1024到49151端口是注册端口,49152到65535则分配给动态或私人端口。
- 下面是软件运行的整体效果图,ip地址是一台本地主机,扫描结果显示该主机的80、135、445、443、139端口开启,并大概耗费0.52秒完成扫描。
目录
- 实现原理
- 功能介绍
- 代码实现
一、实现原理
扫描技术
TCP端口扫描一般分为以下几种类型:
TCP connect扫描:也称为全连接扫描,这种方式直接连接到目标端口,完成了TCP三次握手的过程,这种方式扫描结果比较准确,但速度比较慢而且可轻易被目标系统检测到。
TCP SYN扫描:也称为半开放扫描,这种方式将发送一个SYN包,启动一个TCP会话,并等待目标响应数据包。如果收到的是一个RST包,则表明端口是关闭的,而如果收到的是一个SYN/ACK包,则表示相应的端口是打开的。
Tcp FIN扫描:这种方式发送一个表示断开TCP连接的FIN包,让对方关闭连接。如果收到了一个RST包,则表明相应的端口是关闭的。
TCP XMAS扫描:这种方式通过发送PSH、FIN、URG、和TCP标志位被设为1的数据包。如果收到了一个RST包,则表明相应的端口是关闭的。
本篇则是使用TCP connect扫描进行端口检测
二、功能介绍
线程数:选择线程数实现多线程扫描;
超时时间:如果在超时时间范围内没有收到回复,表示端口关闭;
扫描方式:扫描方式分为常规扫描、全扫描和指定扫描
①常规扫描:对20, 21, 22, 23, 25, 53, 80, 81等常用端口进行扫描;
②全扫描:对0到65535端口进行扫描;
③指定扫描:对指定端口进行扫描。
三、代码实现
python脚本实现端口扫描
使用内建的库 multiprocessing.dummy 来实现多线程扫描
# coding: utf-8
import socket
from datetime import datetime
from multiprocessing.dummy import Pool as ThreadPool
import sys
def scan_port(port):
ip = sys.argv[1]
try:
s = socket.socket(2, 1)
res = s.connect_ex((ip, port))
if res == 0: # 如果端口开启 发送 hello 获取banner
print('Port {}: OPEN'.format(port))
s.close()
except Exception as e:
print(str(e.message))
def init_set(ip_adress, threads, time, type, port_s, port_e):
remote_server_ip = ip_adress # ip地址
ports = []
print('-' * 60)
print('Please wait, scanning remote host ', remote_server_ip)
print('-' * 60)
socket.setdefaulttimeout(float(time)/1000.0) # 设置超时时间
if type == "全扫描":
for i in range(1, 65535):
ports.append(i)
elif type == "常规扫描":
ports = [20, 21, 22, 23, 25, 53, 80, 81, 102, 109, 110, 119, 135, 137, 138, 139, 161, 443, 445, 554, 1024, 1080,
1755, 4000, 5554, 5632, 8080] # 常规端口
else:
for i in range(int(port_s), int(port_e)+1):
ports.append(i)
# Check what time the scan started
t1 = datetime.now()
pool = ThreadPool(processes=int(threads)) # 创建进程
results = pool.map(scan_port, ports)
pool.close()
pool.join()
print('Multiprocess Scanning Completed in ', datetime.now() - t1) # 显示运行的时间
# 传递参数,包括 ip地址,线程数、超时时间、扫描类型、扫描起始端口和终止端口
init_set(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4], sys.argv[5], sys.argv[6])
C#调用脚本
对于python脚本中包含第三方模块的情况,同样,通过直接创建Process进程,调用python脚本,返回扫描结果。
- 创建按钮按下事件button1_Click,运行“调用python脚本”函数runPythonScan()
private void button4_Click(object sender, EventArgs e)
{
richTextBox2.Clear();
runPythonScan();//运行python函数
label17.Text = "开始扫描...";
}
- 实例化一个python进程 调用.py 脚本
void runPythonScan()
{
string ip = textBox2.Text;
string thread = comboBox4.Text;
string time = comboBox2.Text;
string type = comboBox5.Text;
string port_start = textBox3.Text;
string port_end = textBox4.Text;
p = new Process();
string path = "port_scan.py";//待处理python文件的路径,本例中放在debug文件夹下
string sArguments = path;
ArrayList arrayList = new ArrayList();
arrayList.Add(ip);//需要渗透的网站
arrayList.Add(thread);//线程数
arrayList.Add(time);//超时时间
arrayList.Add(type);//扫描类型
arrayList.Add(port_start);//起始端口
arrayList.Add(port_end);//终止端口
foreach (var param in arrayList)//拼接参数
{
sArguments += " " + param;
}
p.StartInfo.FileName = @"D:\Anaconda\python.exe"; //没有配环境变量的话,可以写"xx\xx\python.exe"的绝对路径。如果配了,直接写"python"即可
p.StartInfo.Arguments = sArguments;//python命令的参数
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
p.Start();//启动进程
//MessageBox.Show("启动成功");
p.BeginOutputReadLine();
p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived_scan);
Console.ReadLine();
//p.WaitForExit();
}
- 输出接收事件函数
void p_OutputDataReceived_scan(object sender, DataReceivedEventArgs e)
{
var printedStr = e.Data;
Action at = new Action(delegate ()
{
//接受.py进程打印的字符信息到文本显示框
richTextBox2.AppendText(printedStr + "\n");
label7.Text = "扫描结束";
});
Invoke(at);
}
github地址:https://github.com/Chenmengx/Penetration-testing-tool
使用C#winform编写渗透测试工具--端口扫描的更多相关文章
- #使用C#winform编写渗透测试工具--子域名挖掘
使用C#winform编写渗透测试工具--子域名挖掘 这篇文章主要介绍使用C#winform编写渗透测试工具--子域名挖掘.在渗透测试中,子域名的收集十分重要,通常一个网站的主站的防御能力特别强,而他 ...
- 使用C#winform编写渗透测试工具--暴力破解
使用C#winform编写渗透测试工具--暴力破解 这篇文章主要介绍使用C#winform编写渗透测试工具--暴力破解.暴力破解是指通过利用大量猜测和穷举的方式来尝试获取用户口令的攻击方式.简单来说就 ...
- 使用C#winform编写渗透测试工具--敏感目录扫描
使用C#winform编写渗透测试工具--敏感目录扫描 由于之前在做渗透测试的时候,发现使用的工具较多,切换起来较麻烦,便萌生了开发一个包含各种渗透测试工具的小程序,包括敏感目录扫描.端口查询.子域名 ...
- 使用C#winform编写渗透测试工具--Web指纹识别
使用C#winform编写渗透测试工具--web指纹识别 本篇文章主要介绍使用C#winform编写渗透测试工具--Web指纹识别.在渗透测试中,web指纹识别是信息收集关键的一步,通常是使用各种工具 ...
- 使用C#winform编写渗透测试工具--SQL注入
使用C#winform编写渗透测试工具--SQL注入 本篇文章主要介绍使用C#winform编写渗透测试工具,实现SQL注入的功能.使用python编写SQL注入脚本,基于get显错注入的方式进行数据 ...
- github渗透测试工具库
本文作者:Yunying 原文链接:https://www.cnblogs.com/BOHB-yunying/p/11856178.html 导航: 2.漏洞练习平台 WebGoat漏洞练习平台: h ...
- github渗透测试工具库[转载]
前言 今天看到一个博客里有这个置顶的工具清单,但是发现这些都是很早以前就有文章发出来的,我爬下来后一直放在txt里吃土.这里一起放出来. 漏洞练习平台 WebGoat漏洞练习平台:https://gi ...
- 渗透测试工具BurpSuite做网站的安全测试(基础版)
渗透测试工具BurpSuite做网站的安全测试(基础版) 版权声明:本文为博主原创文章,未经博主允许不得转载. 学习网址: https://t0data.gitbooks.io/burpsuite/c ...
- GyoiThon:基于机器学习的渗透测试工具
简介 GyoiThon是一款基于机器学习的渗透测试工具. GyoiThon根据学习数据识别安装在Web服务器上的软件(操作系统,中间件,框架,CMS等).之后,GyoiThon为已识别的软件执行有效的 ...
随机推荐
- 从五大结构体,带你掌握鸿蒙轻内核动态内存Dynamic Memory
摘要:本文带领大家一起剖析了鸿蒙轻内核的动态内存模块的源代码,包含动态内存的结构体.动态内存池初始化.动态内存申请.释放等. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列九 动态内存Dyna ...
- DOS命令行(7)——Windows网络检测与诊断
ping ping 命令的作用是通过发送"网际控制报文协议(ICMP)"回响请求消息来验证另一台TCP/IP计算机的IP级连接状态,回响应答消息的接收情况将和返回过程的次数一起显示 ...
- 精通Proteus仿真器件制作(3)DLL仿真模型创建
有些人可能会想:什么叫做"DLL仿真模型之原理图符号"?我想学高级的C++创建DLL(动态链接库)仿真模型的方式,你别拦着我,不然,我可就人挡Kill人,佛挡Kill佛啦!原理图符 ...
- [.NET Core知识点回顾]-自动内存管理
自动内存管理是公共语言运行时在托管执行过程中提供的服务之一.公共语言运行时的垃圾回收器为应用程序管理内存 的分配和释放.对开发人员而言,在开发托管应用程序时不必编写执行内存管理任务代码. 分配内存 初 ...
- 20204107 孙嘉临《PYTHON程序设计》计算器设计实验二报告
课程:<python程序设计> 班级:2041 姓名:孙嘉临 学号:20204107 实验教师:王志强 实验日期:2021年4月12日 必修/选修:公选课 ##一.实验内容 设计并完成一个 ...
- C. Learning Languages 求联通块的个数
C. Learning Languages 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring&g ...
- JAVA 类修饰符
JAVA类的修饰符主要有public,default,protected,private,final,abstract,static 其中外部类中用到的只有public,final,abstract或 ...
- PO,VO,BO,POJO,DAO的区别
基本概念 PO:persistant object (持久化对象),可以看成是与数据库中的表相映射的java对象.最简单的PO就是对应数据库中某个表中的一条记录,多个记录可以用PO的集合.PO中应该不 ...
- MySQL 数据库恢复一张表中的数据
如果使用 mysqldump -uroot -p123 user > test.sql备份了user数据库中的所有数据,但是当前只想要恢复该数据库的某张表数据,该怎么处理呢? 已知恢复整个数据库 ...
- QT单进程下载
QT 同步下载 #include <QNetworkAccessManager> #include <QNetworkRequest> #include <QNet ...