使用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秒完成扫描。


目录

  1. 实现原理
  2. 功能介绍
  3. 代码实现

一、实现原理

扫描技术

TCP端口扫描一般分为以下几种类型:

  1. TCP connect扫描:也称为全连接扫描,这种方式直接连接到目标端口,完成了TCP三次握手的过程,这种方式扫描结果比较准确,但速度比较慢而且可轻易被目标系统检测到。

  2. TCP SYN扫描:也称为半开放扫描,这种方式将发送一个SYN包,启动一个TCP会话,并等待目标响应数据包。如果收到的是一个RST包,则表明端口是关闭的,而如果收到的是一个SYN/ACK包,则表示相应的端口是打开的。

  3. Tcp FIN扫描:这种方式发送一个表示断开TCP连接的FIN包,让对方关闭连接。如果收到了一个RST包,则表明相应的端口是关闭的。

  4. 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编写渗透测试工具--端口扫描的更多相关文章

  1. #使用C#winform编写渗透测试工具--子域名挖掘

    使用C#winform编写渗透测试工具--子域名挖掘 这篇文章主要介绍使用C#winform编写渗透测试工具--子域名挖掘.在渗透测试中,子域名的收集十分重要,通常一个网站的主站的防御能力特别强,而他 ...

  2. 使用C#winform编写渗透测试工具--暴力破解

    使用C#winform编写渗透测试工具--暴力破解 这篇文章主要介绍使用C#winform编写渗透测试工具--暴力破解.暴力破解是指通过利用大量猜测和穷举的方式来尝试获取用户口令的攻击方式.简单来说就 ...

  3. 使用C#winform编写渗透测试工具--敏感目录扫描

    使用C#winform编写渗透测试工具--敏感目录扫描 由于之前在做渗透测试的时候,发现使用的工具较多,切换起来较麻烦,便萌生了开发一个包含各种渗透测试工具的小程序,包括敏感目录扫描.端口查询.子域名 ...

  4. 使用C#winform编写渗透测试工具--Web指纹识别

    使用C#winform编写渗透测试工具--web指纹识别 本篇文章主要介绍使用C#winform编写渗透测试工具--Web指纹识别.在渗透测试中,web指纹识别是信息收集关键的一步,通常是使用各种工具 ...

  5. 使用C#winform编写渗透测试工具--SQL注入

    使用C#winform编写渗透测试工具--SQL注入 本篇文章主要介绍使用C#winform编写渗透测试工具,实现SQL注入的功能.使用python编写SQL注入脚本,基于get显错注入的方式进行数据 ...

  6. github渗透测试工具库

    本文作者:Yunying 原文链接:https://www.cnblogs.com/BOHB-yunying/p/11856178.html 导航: 2.漏洞练习平台 WebGoat漏洞练习平台: h ...

  7. github渗透测试工具库[转载]

    前言 今天看到一个博客里有这个置顶的工具清单,但是发现这些都是很早以前就有文章发出来的,我爬下来后一直放在txt里吃土.这里一起放出来. 漏洞练习平台 WebGoat漏洞练习平台:https://gi ...

  8. 渗透测试工具BurpSuite做网站的安全测试(基础版)

    渗透测试工具BurpSuite做网站的安全测试(基础版) 版权声明:本文为博主原创文章,未经博主允许不得转载. 学习网址: https://t0data.gitbooks.io/burpsuite/c ...

  9. GyoiThon:基于机器学习的渗透测试工具

    简介 GyoiThon是一款基于机器学习的渗透测试工具. GyoiThon根据学习数据识别安装在Web服务器上的软件(操作系统,中间件,框架,CMS等).之后,GyoiThon为已识别的软件执行有效的 ...

随机推荐

  1. 同事内推的那位Linux C/C++后端开发同学面试没过......

    最近同事内推了一位 Linux C/C++ 后端开发的同学到我们公司面试,我是一面的面试官,很遗憾这位工作了两年的同学面试表现不是很好.我问了如下一些问题: "redis持久化机制,redi ...

  2. 手写Spring,定义标记类型Aware接口,实现感知容器对象

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 同事写的代码,我竟丝毫看不懂! 大佬的代码,就像 "赖蛤蟆泡青蛙,张的丑玩 ...

  3. Docker笔记--镜像&基于GO项目创建Docker镜像

    Docker笔记--镜像&基于GO项目创建Docker镜像 核心概念 Doker镜像--包含一个基本的操作系统运行环境和应用程序,镜像是创建Docker容器的基础. Docker容器--如果把 ...

  4. external-attacher源码分析(1)-main方法与启动参数分析

    更多 ceph-csi 其他源码分析,请查看下面这篇博文:kubernetes ceph-csi分析目录导航 摘要 ceph-csi分析-external-attacher源码分析.external- ...

  5. 图的存储与遍历C++实现

    1.图的存储 设点数为n,边数为m 1.1.二维数组 方法:使用一个二维数组 adj 来存边,其中 adj[u][v] 为 1 表示存在 u到 v的边,为 0 表示不存在.如果是带边权的图,可以在 a ...

  6. 界面设计ie8 笔记

    1.ie8 jsp中设置 margin:0 auto 无效 解决方法  在html 标签改为<!DOCTYPE html> 2.ie8 input file 无法通过js触发点击事件,网上 ...

  7. LeetCode解题记录(贪心算法)(一)

    1. 前言 目前得到一本不错的算法书籍,页数不多,挺符合我的需要,于是正好借这个机会来好好的系统的刷一下算法题,一来呢,是可以给部分同学提供解题思路,和一些自己的思考,二来呢,我也可以在需要复习的时候 ...

  8. Gym 100008E Harmonious Matrices 高斯消元

    POJ 1222 高斯消元更稳 看这个就懂了 #include <bits/stdc++.h> using namespace std; const int maxn = 2000; in ...

  9. k8s部署docker容器

    一.环境 需机器已部署好k8s和docker的环境 二.操作步骤 1.将制作好的镜像推送到docker仓库 docker tag nginx:test harbor:test-nginx docker ...

  10. JDK1.8 ArrayList 源码解析

    源码的解读逻辑按照程序运行的轨迹展开 Arraylist的继承&实现关系 打开ArrayList源码,会看到有如下的属性定义, ArrayList中定义的属性 /** * Default in ...