端口扫描器的设计与实现代码_简单的端口扫描器论文

hacker|
208

求: *** 端口扫描器的算法

闪电1.0 是一个多线程的端口扫描工具,用于进行狂速端口扫描。它具有极快的速度 和方便友好的操作界面,能快速地对大网段范围进行 Connect方式端口扫描。同时具有获取端口标识的功能,可以用来快速地获取端口标识(Banner),能对80端口标识进行特别处理,能方便地获取Web Server类型。当扫描到木马程序端口时,可以提示常见木马。 主要功能如下 ( 1) 发现因特网上的一个 *** 或者一台主机。 (2) 一旦发现一台主机,就能扫描到开放端口号和提供的服务, 能对常见木马端口返回标识。 (3)可以进行域名正向解析和反向解析。 (4)可以获取局域网在线主机的MAC地址和主机名。 (5)提供了基于窗口Ping功能和局域网信使服务。 (6)可以获取本机 *** 配制相关信息,如本机IP, 子网掩码,MAC地址,网卡类型和网关IP和DNS的IP。

你可以到 去下载

毕业论文

相关资料:

企业内网安全分析与策略

一、背景分析

提起 *** 信息安全,人们自然就会想到病毒破坏和黑客攻击。其实不然, *** 和企业因信息被窃取所造成的损失远远超过病毒破坏和黑客攻击所造成的损失,据权威机构调查:三分之二以上的安全威胁来自泄密和内部人员犯罪,而非病毒和外来黑客引起。

目前, *** 、企业等社会组织在 *** 安全防护建设中,普遍采用传统的内网边界安全防护技术,即在组织 *** 的边缘设置网关型边界防火墙、AAA认证、入侵检测系统IDS等等 *** 边界安全防护技术,对 *** 入侵进行监控和防护,抵御来自组织外部攻击、防止组织 *** 资源、信息资源遭受损失,保证组织业务流程的有效进行。

这种解决策略是针对外部入侵的防范,对于来自 *** 内部的对企业 *** 资源、信息资源的破坏和非法行为的安全防护却无任何作用。对于那些需要经常移动的终端设备在安全防护薄弱的外部 *** 环境的安全保障,企业基于 *** 边界的安全防护技术就更是鞭长莫及了,由此危及到内部 *** 的安全。一方面,企业中经常会有人私自以Modem拨号方式、手机或无线网卡等方式上网,而这些机器通常又置于企业内网中,这种情况的存在给企业 *** 带来了巨大的潜在威胁;另一方面,黑客利用虚拟专用 *** VPN、无线局域网、操作系统以及 *** 应用程序的各种漏洞就可以绕过企业的边界防火墙侵入企业内部 *** ,发起攻击使内部 *** 瘫痪、重要服务器宕机以及破坏和窃取企业内部的重要数据。

二、内网安全风险分析

现代企业的 *** 环境是建立在当前飞速发展的开放 *** 环境中,顾名思义,开放的环境既为信息时代的企业提供与外界进行交互的窗口,同时也为企业外部提供了进入企业最核心地带——企业信息系统的便捷途径,使企业 *** 面临种种威胁和风险:病毒、蠕虫对系统的破坏;系统软件、应用软件自身的安全漏洞为不良企图者所利用来窃取企业的信息资源;企业终端用户由于安全意识、安全知识、安全技能的匮乏,导致企业安全策略不能真正的得到很好的落实,开放的 *** 给企业的信息安全带来巨大的威胁。

1.病毒、蠕虫入侵

目前,开放 *** 面临的病毒、蠕虫威胁具有传播速度快、范围广、破坏性大、种类多、变化快等特点,即使再先进的防病毒软件、入侵检测技术也不能独立有效地完成安全防护,特别是对新类型新变种的病毒、蠕虫,防护技术总要相对落后于新病毒新蠕虫的入侵。

病毒、蠕虫很容易通过各种途径侵入企业的内部 *** ,除了利用企业 *** 安全防护措施的漏洞外,更大的威胁却是来自于内部 *** 用户的各种危险应用:不安装杀毒软件;安装杀毒软件但不及时升级; *** 用户在安装完自己的办公桌面系统后,未采取任何有效防护措施就连接到危险的 *** 环境中,特别是Internet;移动用户计算机连接到各种情况不明 *** 环境,在没有采取任何防护措施的情况下又连入企业 *** ;桌面用户在终端使用各种数据介质、软件介质等等都可能将病毒、蠕虫在不知不觉中带入到企业 *** 中,给企业信息基础设施,企业业务带来无法估量的损失。

2.软件漏洞隐患

企业 *** 通常由数量庞大、种类繁多的软件系统组成,有系统软件、数据库系统、应用软件等等,尤其是存在于广大终端用户办公桌面上的各种应用软件不胜繁杂,每一个软件系统都有不可避免的、潜在的或已知的软件漏洞。无论哪一部分的漏洞被利用,都会给企业带来危害,轻者危及个别设备,重者成为攻击整个企业 *** 媒介,危及整个企业 *** 安全。

3.系统安全配置薄弱

企业 *** 建设中应用的各种软件系统都有各自默认的安全策略增强的安全配置设置,例如,账号策略、审核策略、屏保策略、匿名访问限制、建立拨号连接限制等等。这些安全配置的正确应用对于各种软件系统自身的安全防护的增强具有重要作用,但在实际的企业 *** 环境中,这些安全配置却被忽视,尤其是那些 *** 的终端用户,导致软件系统的安全配置成为“软肋”、有时可能严重为配置漏洞,完全暴露给整个外部。例如某些软件系统攻击中采用的“口令强制攻击”就是利用了弱口令习惯性的使用安全隐患,黑客利用各种 *** 应用默认安装中向外部提供的有限信息获取攻击的必要信息等等。

4.脆弱的 *** 接入安全防护

传统的 *** 访问控制都是在企业 *** 边界进行的,或在不同的企业内网不同子网边界进行且在 *** 访问用户的身份被确认后,用户即可以对企业内网进行各种访问操作。在这样一个访问控制策略中存在无限的企业 *** 安全漏洞,例如,企业 *** 的合法移动用户在安全防护较差的外网环境中使用VPN连接、远程拨号、无线AP,以太网接入等等 *** 接入方式,在外网和企业内网之间建立一个安全通道。

另一个传统 *** 访问控制问题来自企业 *** 内部,尤其对于大型企业 *** 拥有成千上万的用户终端,使用的 *** 应用层出不穷,目前对于企业网管很难准确的控制企业 *** 的应用,这样的现实导致安全隐患的产生:员工使用未经企业允许的 *** 应用,如邮件服务器收发邮件,这就可能使企业的保密数据外泄或感染邮件病毒;企业内部员工在终端上私自使用未经允许的 *** 应用程序,在此过程中就有可能下载到带有病毒、木马程序等恶意代码的软件,从而感染内部 *** ,进而造成内部 *** 中敏感数据的泄密或损毁。

5.企业 *** 入侵

现阶段黑客攻击技术细分下来共有8类,分别为入侵系统类攻击、缓冲区溢出攻击、欺骗类攻击、拒绝服务攻击、对防火墙的攻击、病毒攻击、伪装程序/木马程序攻击、后门攻击。

对于采取各种传统安全防护措施的企业内网来说,都没有万无一失的把握;对于从企业内网走出到安全防护薄弱的外网环境的移动用户来说,安全保障就会严重恶化,当移动用户连接到企业内网,就会将各种 *** 入侵带入企业 *** 。

6.终端用户计算机安全完整性缺失

随着 *** 技术的普及和发展,越来越多的员工会在企业专网以外使用计算机办公,同时这些移动员工需要连接回企业的内部 *** 获取工作必须的数据。由于这些移动用户处于专网的保护之外,很有可能被黑客攻陷或感染 *** 病毒。同时,企业现有的安全投资(如:防病毒软件、各种补丁程序、安全配置等)若处于不正常运行状态,终端员工没有及时更新病毒特征库,或私自卸载安全软件等,将成为黑客攻击内部 *** 的跳板。

三、内网安全实施策略

1.多层次的病毒、蠕虫防护

病毒、蠕虫破坏 *** 安全事件一直以来在 *** 安全领域就没有一个根本的解决办法,其中的原因是多方面的,有人为的原因,如不安装防杀病毒软件,病毒库未及时升级等等,也有技术上的原因,杀毒软件、入侵防范系统等安全技术对新类型、新变异的病毒、蠕虫的防护往往要落后一步。危害好像是无法避免的,但我们可以控制它的危害程度,只要我们针对不同的原因采取有针对性的切实有效的防护办法,就会使病毒、蠕虫对企业的危害减少到更低限度,甚至没有危害。这样,仅靠单一、简单的防护技术是难以防护病毒、蠕虫的威胁的。

2.终端用户透明、自动化的补丁管理,安全配置

为了弥补和纠正运行在企业 *** 终端设备的系统软件、应用软件的安全漏洞,使整个企业 *** 安全不至由于个别软件系统的漏洞而受到危害,完全必要在企业的安全管理策略中加强对补丁升级、系统安全配置的管理。

用户可通过管理控制台集中管理企业 *** 终端设备的软件系统的补丁升级、系统配置策略,定义终端补丁下载。将补丁升级策略、增强终端系统安全配置策略下发给运行于各终端设备上的安全 *** ,安全 *** 执行这些策略,以保证终端系统补丁升级、安全配置的完备有效,整个管理过程都是自动完成的,对终端用户来说完全透明,减少了终端用户的麻烦和企业 *** 的安全风险,提高企业 *** 整体的补丁升级、安全配置管理效率和效用,使企业 *** 的补丁及安全配置管理策略得到有效的落实。

3.全面的 *** 准入控制

为了解决传统的外网用户接入企业 *** 给企业 *** 带来的安全隐患,以及企业 *** 安全管理人员无法控制内部员工 *** 行为给企业 *** 带来的安全问题,除了有效的解决企业员工从企业内网、外网以各种 *** 接入方式接入企业 *** 的访问控制问题,同时对传统的 *** 边界访问控制没有解决的 *** 接入安全防护措施,而采用边界准入控制、接入层准入控制等技术进行全面的实现准入控制。当外网用户接入企业 *** 时,检查客户端的安全策略状态是否符合企业整体安全策略,对于符合的外网访问则放行。一个全面的 *** 准入检测系统。

4.终端设备安全完整性保证

主机完整性强制是确保企业 *** 安全的关键组件。主机完整性可确保连接到企业网的客户端正运行着所需的应用程序和数据文件。信息安全业界已经开发出了多种基于主机的安全产品,以确保企业 *** 和信息的安全,阻止利用 *** 连接技术、应用程序和操作系统的弱点和漏洞所发起的攻击。并已充分采用了在个人防火墙、入侵检测、防病毒、文件完整性、文件加密和安全补丁程序等方面的技术进步来有效地保护企业设备。然而,只有在充分保证这些安全技术的应用状态、更新级别和策略完整性之后,才能享受这些安全技术给企业 *** 安全带来的益处。如果企业端点设备不能实施主机完整性,也就不能将该设备看成企业 *** 受信设备。

仅供参考,请自借鉴

希望对您有帮助

如何用C++编写简易端口扫描器(要详细步骤)

#includewinsock2.h

#includestdio.h

#include time.h//计时需要用到的头文件

#pragma comment(lib,"ws2_32.lib")

#include time.h//计时需要用到的头文件

clock_t start,end;//程序运行的起始和结束时间

float costtime;//程序耗时

void usage(void)

{

printf("\tusage: tcpscan RemoteIP StartPort-EndPort\n");

printf("\tExample: tcpscan 192.168.1.1 80-100\n");

}

int main(int argc,char **argv)

{

char *host;

int startport,endport;

char *p;

if(argc!=3)

{

usage();

return 0;

}

p=argv[2];//处理端口参数

if(strstr(argv[2],"-"))

{ startport=atoi(argv[2]);

for(;*p;)

if(*(p++)=='-')break;

endport=atoi(p);

if(startport1 || endport65535)

{ printf("Port Error!\n");

return 0;

}

}

host=argv[1];

WSADATA ws;

SOCKET s;

struct sockaddr_in addr;

int result;

long lresult;

lresult=WSAStartup(MAKEWORD(1,1), ws);

addr.sin_family =AF_INET;

addr.sin_addr.s_addr =inet_addr(host);

start=clock();//开始计时

for (int i=startport;iendport;i++)

{

s=socket(AF_INET, SOCK_STREAM, 0);

addr.sin_port = htons(i);

if(s==INVALID_SOCKET)break;

result=connect(s, (struct sockaddr*)addr,sizeof(addr));

if(result==0)

{

printf("%s %d\n",host,i);

closesocket(s);

}

}

end=clock();//计时结束

costtime= (float)(end - start) / CLOCKS_PER_SEC; //转换时间格式

printf("Cost time:%f second",costtime);//显示耗时

WSACleanup();

}

什么是端口扫描器?它有什么作用?

s 扫描器是一款命令行下高速扫描利器,通过最新的瑞星杀毒软件测试

命令: s.exe syn ip1 ip2 端口号 /save

s.exe tcp ip1 ip2 端口号 线程数 /save

s.exe扫描器的使用说明

首先我解释下什么是S扫描器,S扫描器是针对微软ms04045漏洞出的一个扫描,原来作者出这东西

的目的是为了扫描这个漏洞,但现在已经变成我们黑客手中的兵器了,大家也许看过很多如何找肉鸡的

动画或刷QB的动画,那些动画里面很多都是用S扫描器来扫描肉鸡或别人电脑所开放的端口及一些漏洞,

都用这工具的好处是它的扫描速度实在是一个字---强! 今天我就来教下大家如何使用S扫描器。

简单说明下它的用处:

S扫描器是一个简单的使用两种常用的扫描方式进行端口扫描的端口扫描器程序.

可实现的功能是:

1.两种不同的扫描方式(SYN扫描和一般的connect扫描)

2.可以扫描单个IP或IP段所有端口

3.可以扫描单个IP或IP段单个端口

4.可以扫描单个IP或IP段用户定义的端口

5.可以显示打开端口的banner

6.可将结果写入文件

7.TCP扫描可自定义线程数

用法:scanner TCP/SYN StartIP [EndIP] Ports [Threads] [/Banner] [/Save]

参数说明:

TCP/SYN - TCP方式扫描或SYN方式扫描(SYN扫描需要在win 2k或以上系统才行),SYN扫描对本机无效

StartIP - 起始扫描的IP

EndIP - 结束扫描的IP,可选项,如果这一项没有,就只是对单个IP扫描

Ports - 可以是单个端口,连续的一段端口或非连续的端口

Threads - 使用更大线程数去扫描(SYN扫描不需要加这一项),不能超过1024线程

/Banner - 扫描端口时一并将Banner显示出来,这一选项只对TCP扫描有效

/Save - 将结果写入当前目录的Result.txt文件中去

打开S扫描器,下面我举几个例子演示下S扫描器的主要几个作用。

例子一:

S TCP 218.80.12.1 218.80.12.123 80 512

TCP扫描218.80.12.1到218.80.12.123这IP段中的80端口,更大并发线程是512

例子二:

S TCP 218.80.12.1 218.80.12.123 21,5631 512 /Banner

TCP扫描218.80.12.1到218.80.12.123这IP段中的21和5631端口,更大并发线程是512,并显示Banner

例子三:

S TCP 218.80.12.1 218.80.12.12 1-200 512

TCP扫描218.80.12.1到218.80.12.12这IP段中的1到200端口,更大并发线程是512

例子四:

S TCP 218.80.12.7 1-200 512

TCP扫描218.80.12.7这IP中的1到200端口,更大并发线程是512

例子五:

S SYN 218.80.12.7 1-65535 /Save

SYN扫描218.80.12.7这IP中的1到65535端口,将结果写入Result.txt

扫描结束后Result.txt就存放在你的S扫描器所在的目录里。刚才扫描的东西都在里面。

例子六:

S SYN 218.80.12.1 218.80.12.255 21 /Save

SYN扫描218.80.12.1到218.80.12.255这IP段中的21端口,将结果写入Result.txt

这个我重点说明一下,因为这条命令就是专门用来找肉鸡的,扫描一个IP段有没有开3389的或1433的

我示范下:S SYN 218.80.1.1 218.80.255.255 3389 /Save

注意:

1.SYN扫描是很依赖于扫描者和被扫描者的网速的,如果你是内网的系统,那你不一定可以使用SYN扫描的

,因为你的网关的类型会决定内网系统是否能进行SYN扫描.如果你的配置较低的话,我也不推荐使用

SYN扫描.SYN扫描速度是比TCP扫描的速度快很多的,但在稳定性方面却不是太好,所以自己决定使用

哪种模式进行扫描。

2.SYN扫描不需要线程那个参数,请看上面例子5和6

3.TCP扫描的更大并发线程不能超过1024.

4.使用SYN模式扫描,不能扫描Banner,具体为什么不能,请查看有关SYN的资料

5.内网用户的朋友可以用tcp扫描

关于S.exe 的用法和错误解释

S扫描器扫描命令是:

文件名 参数 起始IP 结束IP 要扫描的端口 保存

s SYN 61.0.0.0 61.255.255.255 1433 save

1433是SQL server 服务器端口

8080是 *** 服务器端口

如何用Scapy写一个端口扫描器

常见的端口扫描类型有:

1. TCP 连接扫描

2. TCP SYN 扫描(也称为半开放扫描或stealth扫描)

3. TCP 圣诞树(Xmas Tree)扫描

4. TCP FIN 扫描

5. TCP 空扫描(Null)

6. TCP ACK 扫描

7. TCP 窗口扫描

8. UDP 扫描

下面先讲解每种扫描的原理,随后提供具体实现代码。

TCP 连接扫描

客户端与服务器建立 TCP 连接要进行一次三次握手,如果进行了一次成功的三次握手,则说明端口开放。

客户端想要连接服务器80端口时,会先发送一个带有 SYN 标识和端口号的 TCP 数据包给服务器(本例中为80端口)。如果端口是开放的,则服务器会接受这个连接并返回一个带有 SYN 和 ACK 标识的数据包给客户端。随后客户端会返回带有 ACK 和 RST 标识的数据包,此时客户端与服务器建立了连接。如果完成一次三次握手,那么服务器上对应的端口肯定就是开放的。

当客户端发送一个带有 SYN 标识和端口号的 TCP 数据包给服务器后,如果服务器端返回一个带 RST 标识的数据包,则说明端口处于关闭状态。

代码:

#! /usr/bin/python

import logging

logging.getLogger("scapy.runtime").setLevel(logging.ERROR)

from scapy.all import *

dst_ip = "10.0.0.1"

src_port = RandShort()

dst_port=80

tcp_connect_scan_resp = sr1(IP(dst=dst_ip)/TCP(sport=src_port,dport=dst_port,flags="S"),timeout=10)

if(str(type(tcp_connect_scan_resp))=="type 'NoneType'"):

print "Closed"

elif(tcp_connect_scan_resp.haslayer(TCP)):

if(tcp_connect_scan_resp.getlayer(TCP).flags == 0x12):

send_rst = sr(IP(dst=dst_ip)/TCP(sport=src_port,dport=dst_port,flags="AR"),timeout=10)

print "Open"

elif (tcp_connect_scan_resp.getlayer(TCP).flags == 0x14):

print "Closed"

TCP SYN 扫描

这个技术同 TCP 连接扫描非常相似。同样是客户端向服务器发送一个带有 SYN 标识和端口号的数据包,如果目标端口开发,则会返回带有 SYN 和 ACK 标识的 TCP 数据包。但是,这时客户端不会返回 RST+ACK 而是返回一个只带有 RST 标识的数据包。这种技术主要用于躲避防火墙的检测。

如果目标端口处于关闭状态,那么同之前一样,服务器会返回一个 RST 数据包。

代码:

#! /usr/bin/python

import logging

logging.getLogger("scapy.runtime").setLevel(logging.ERROR)

from scapy.all import *

dst_ip = "10.0.0.1"

src_port = RandShort()

dst_port=80

stealth_scan_resp = sr1(IP(dst=dst_ip)/TCP(sport=src_port,dport=dst_port,flags="S"),timeout=10)

if(str(type(stealth_scan_resp))=="type 'NoneType'"):

print "Filtered"

elif(stealth_scan_resp.haslayer(TCP)):

if(stealth_scan_resp.getlayer(TCP).flags == 0x12):

send_rst = sr(IP(dst=dst_ip)/TCP(sport=src_port,dport=dst_port,flags="R"),timeout=10)

print "Open"

elif (stealth_scan_resp.getlayer(TCP).flags == 0x14):

print "Closed"

elif(stealth_scan_resp.haslayer(ICMP)):

if(int(stealth_scan_resp.getlayer(ICMP).type)==3 and int(stealth_scan_resp.getlayer(ICMP).code) in [1,2,3,9,10,13]):

print "Filtered"

TCP 圣诞树(Xmas Tree)扫描

在圣诞树扫描中,客户端会向服务器发送带有 PSH,FIN,URG 标识和端口号的数据包给服务器。如果目标端口是开放的,那么不会有任何来自服务器的回应。

如果服务器返回了一个带有 RST 标识的 TCP 数据包,那么说明端口处于关闭状态。

但如果服务器返回了一个 ICMP 数据包,其中包含 ICMP 目标不可达错误类型3以及 ICMP 状态码为1,2,3,9,10或13,则说明目标端口被过滤了无法确定是否处于开放状态。

代码:

#! /usr/bin/python

import logging

logging.getLogger("scapy.runtime").setLevel(logging.ERROR)

from scapy.all import *

dst_ip = "10.0.0.1"

src_port = RandShort()

dst_port=80

xmas_scan_resp = sr1(IP(dst=dst_ip)/TCP(dport=dst_port,flags="FPU"),timeout=10)

if (str(type(xmas_scan_resp))=="type 'NoneType'"):

print "Open|Filtered"

elif(xmas_scan_resp.haslayer(TCP)):

if(xmas_scan_resp.getlayer(TCP).flags == 0x14):

print "Closed"

elif(xmas_scan_resp.haslayer(ICMP)):

if(int(xmas_scan_resp.getlayer(ICMP).type)==3 and int(xmas_scan_resp.getlayer(ICMP).code) in [1,2,3,9,10,13]):

print "Filtered"

TCP FIN扫描

FIN 扫描会向服务器发送带有 FIN 标识和端口号的 TCP 数据包。如果没有服务器端回应则说明端口开放。

如果服务器返回一个 RST 数据包,则说明目标端口是关闭的。

如果服务器返回了一个 ICMP 数据包,其中包含 ICMP 目标不可达错误类型3以及 ICMP 代码为1,2,3,9,10或13,则说明目标端口被过滤了无法确定端口状态。

代码:

#! /usr/bin/python

import logging

logging.getLogger("scapy.runtime").setLevel(logging.ERROR)

from scapy.all import *

dst_ip = "10.0.0.1"

src_port = RandShort()

dst_port=80

fin_scan_resp = sr1(IP(dst=dst_ip)/TCP(dport=dst_port,flags="F"),timeout=10)

if (str(type(fin_scan_resp))=="type 'NoneType'"):

print "Open|Filtered"

elif(fin_scan_resp.haslayer(TCP)):

if(fin_scan_resp.getlayer(TCP).flags == 0x14):

print "Closed"

elif(fin_scan_resp.haslayer(ICMP)):

if(int(fin_scan_resp.getlayer(ICMP).type)==3 and int(fin_scan_resp.getlayer(ICMP).code) in [1,2,3,9,10,13]):

print "Filtered"

TCP 空扫描(Null)

在空扫描中,客户端发出的 TCP 数据包仅仅只会包含端口号而不会有其他任何的标识信息。如果目标端口是开放的则不会回复任何信息。

如果服务器返回了一个 RST 数据包,则说明目标端口是关闭的。

如果返回 ICMP 错误类型3且代码为1,2,3,9,10或13的数据包,则说明端口被服务器过滤了。

代码:

#! /usr/bin/python

import logging

logging.getLogger("scapy.runtime").setLevel(logging.ERROR)

from scapy.all import *

dst_ip = "10.0.0.1"

src_port = RandShort()

dst_port=80

null_scan_resp = sr1(IP(dst=dst_ip)/TCP(dport=dst_port,flags=""),timeout=10)

if (str(type(null_scan_resp))=="type 'NoneType'"):

print "Open|Filtered"

elif(null_scan_resp.haslayer(TCP)):

if(null_scan_resp.getlayer(TCP).flags == 0x14):

print "Closed"

elif(null_scan_resp.haslayer(ICMP)):

if(int(null_scan_resp.getlayer(ICMP).type)==3 and int(null_scan_resp.getlayer(ICMP).code) in [1,2,3,9,10,13]):

print "Filtered"

TCP ACK扫描

ACK 扫描不是用于发现端口开启或关闭状态的,而是用于发现服务器上是否存在有状态防火墙的。它的结果只能说明端口是否被过滤。再次强调,ACK 扫描不能发现端口是否处于开启或关闭状态。

客户端会发送一个带有 ACK 标识和端口号的数据包给服务器。如果服务器返回一个带有 RST 标识的 TCP 数据包,则说明端口没有被过滤,不存在状态防火墙。

如果目标服务器没有任何回应或者返回ICMP 错误类型3且代码为1,2,3,9,10或13的数据包,则说明端口被过滤且存在状态防火墙。

#! /usr/bin/python

import logging

logging.getLogger("scapy.runtime").setLevel(logging.ERROR)

from scapy.all import *

dst_ip = "10.0.0.1"

src_port = RandShort()

dst_port=80

ack_flag_scan_resp = sr1(IP(dst=dst_ip)/TCP(dport=dst_port,flags="A"),timeout=10)

if (str(type(ack_flag_scan_resp))=="type 'NoneType'"):

print "Stateful firewall presentn(Filtered)"

elif(ack_flag_scan_resp.haslayer(TCP)):

if(ack_flag_scan_resp.getlayer(TCP).flags == 0x4):

print "No firewalln(Unfiltered)"

elif(ack_flag_scan_resp.haslayer(ICMP)):

if(int(ack_flag_scan_resp.getlayer(ICMP).type)==3 and int(ack_flag_scan_resp.getlayer(ICMP).code) in [1,2,3,9,10,13]):

print "Stateful firewall presentn(Filtered)"

TCP窗口扫描

TCP 窗口扫描的流程同 ACK 扫描类似,同样是客户端向服务器发送一个带有 ACK 标识和端口号的 TCP 数据包,但是这种扫描能够用于发现目标服务器端口的状态。在 ACK 扫描中返回 RST 表明没有被过滤,但在窗口扫描中,当收到返回的 RST 数据包后,它会检查窗口大小的值。如果窗口大小的值是个非零值,则说明目标端口是开放的。

如果返回的 RST 数据包中的窗口大小为0,则说明目标端口是关闭的。

代码:

#! /usr/bin/python

import logging

logging.getLogger("scapy.runtime").setLevel(logging.ERROR)

from scapy.all import *

dst_ip = "10.0.0.1"

src_port = RandShort()

dst_port=80

window_scan_resp = sr1(IP(dst=dst_ip)/TCP(dport=dst_port,flags="A"),timeout=10)

if (str(type(window_scan_resp))=="type 'NoneType'"):

print "No response"

elif(window_scan_resp.haslayer(TCP)):

if(window_scan_resp.getlayer(TCP).window == 0):

print "Closed"

elif(window_scan_resp.getlayer(TCP).window 0):

print "Open"

UDP扫描

TCP 是面向连接的协议,而UDP则是无连接的协议。

面向连接的协议会先在客户端和服务器之间建立通信信道,然后才会开始传输数据。如果客户端和服务器之间没有建立通信信道,则不会有任何产生任何通信数据。

无连接的协议则不会事先建立客户端和服务器之间的通信信道,只要客户端到服务器存在可用信道,就会假设目标是可达的然后向对方发送数据。

客户端会向服务器发送一个带有端口号的 UDP 数据包。如果服务器回复了 UDP 数据包,则目标端口是开放的。

如果服务器返回了一个 ICMP 目标不可达的错误和代码3,则意味着目标端口处于关闭状态。

如果服务器返回一个 ICMP 错误类型3且代码为1,2,3,9,10或13的数据包,则说明目标端口被服务器过滤了。

但如果服务器没有任何相应客户端的 UDP 请求,则可以断定目标端口可能是开放或被过滤的,无法判断端口的最终状态。

代码:

#! /usr/bin/python

import logging

logging.getLogger("scapy.runtime").setLevel(logging.ERROR)

from scapy.all import *

dst_ip = "10.0.0.1"

src_port = RandShort()

dst_port=53

dst_timeout=10

def udp_scan(dst_ip,dst_port,dst_timeout):

udp_scan_resp = sr1(IP(dst=dst_ip)/UDP(dport=dst_port),timeout=dst_timeout)

if (str(type(udp_scan_resp))=="type 'NoneType'"):

retrans = []

for count in range(0,3):

retrans.append(sr1(IP(dst=dst_ip)/UDP(dport=dst_port),timeout=dst_timeout))

for item in retrans:

if (str(type(item))!="type 'NoneType'"):

udp_scan(dst_ip,dst_port,dst_timeout)

return "Open|Filtered"

elif (udp_scan_resp.haslayer(UDP)):

return "Open"

elif(udp_scan_resp.haslayer(ICMP)):

if(int(udp_scan_resp.getlayer(ICMP).type)==3 and int(udp_scan_resp.getlayer(ICMP).code)==3):

return "Closed"

elif(int(udp_scan_resp.getlayer(ICMP).type)==3 and int(udp_scan_resp.getlayer(ICMP).code) in [1,2,9,10,13]):

return "Filtered"

print udp_scan(dst_ip,dst_port,dst_timeout)

下面解释下上述代码中的一些函数和变量:

RandShort():产生随机数

type():获取数据类型

sport:源端口号

dport:目标端口号

timeout:等待相应的时间

haslayer():查找指定层:TCP或UDP或ICMP

getlayer():获取指定层:TCP或UDP或ICMP

以上扫描的概念可以被用于“多端口扫描”,源码可以参考这里:

Scapy 是一个非常好用的工具,使用它可以非常简单的构建自己的数据包,还可以很轻易的处理数据包的发送和相应。

(译者注:上述所有代码均在Kali 2.0下测试通过,建议读者在Linux环境下测试代码,如想在Windows上测试,请参见 Scapy官方文档 配置好scapy环境)

毕业论文 基于TCP/IP三次握手的端口扫描技术

基于TCP/IP 端口扫描技术

[摘要] 本文讲述了TCP联接的建立过程,以及介绍了一些经典的扫描器以及所谓的SYN扫描器的使用,以及隐藏攻击源的技术,更好介绍了另外一些扫描技术。考虑了一些不是基于TCP端口和主要用来进行安全扫描的扫描工具(例如SATAN)。另外分析了使用扫描器的栈指纹。栈指纹通过检测主机TCP并将应答跟已知操作系统TCP/IP协议栈应答相比较,解决了识别操作系统的问题。 关键字:

TCP/IP,UDP,三阶段握手,SYN扫描,FIN扫描,秘密扫描,间接扫描,诱骗扫描,指纹,协作扫描。

--------------------------------------------------------------------------------

正文:

端口扫描技术

前言

之一部分,我们讲述TCP连接的建立过程(通常称作三阶段握手),然后讨论与扫描程序有关的一些实现细节。

然后,简单介绍一下经典的扫描器(全连接)以及所谓的SYN(半连接)扫描器。

第三部分主要讨论间接扫描和秘密扫描,还有隐藏攻击源的技术。

秘密扫描基于FIN段的使用。在大多数实现中,关闭的端口对一个FIN 段返回一个RST,但是打开的端口通常丢弃这个段,不作任何回答。间接扫描,就像它的名字,是用一个欺骗主机来帮助实施,这台主机通常不是自愿的。

第四部分介绍了一种与应用协议有关扫描。这些扫描器通常利用协议实现中的一些缺陷或者错误。认证扫描(ident scanning)也被成为 *** 扫描(proxy scanning)。

最后一部分,介绍了另外一些扫描技术。考虑了一些不是基于TCP端口和主要用来进行安全扫描的扫描工具(例如SATAN)。另外分析了使用扫描器的栈指纹。栈指纹通过检测主机TCP并将应答跟已知操作系统TCP/IP协议栈应答相比较,解决了识别操作系统的问题。

一:TCP/IP相关问题

连接端及标记

IP地址和端口被称作套接字,它代表一个TCP连接的一个连接端。为了获得TCP服务,必须在发送机的一个端口上和接收机的一个端口上建立连接。TCP连接用两个连接端来区别,也就是(连接端1,连接端2)。连接端互相发送数据包。

一个TCP数据包包括一个TCP头,后面是选项和数据。一个TCP头包含6个标志位。它们的意义分别为:

SYN: 标志位用来建立连接,让连接双方同步序列号。如果SYN=1而ACK=0,则表示该数据包为连接请求,如果SYN=1而ACK=1则表示接受连接。

FIN: 表示发送端已经没有数据要求传输了,希望释放连接。

RST: 用来复位一个连接。RST标志置位的数据包称为复位包。一般情况下,如果TCP收到的一个分段明显不是属于该主机上的任何一个连接,则向远端发送一个复位包。

URG: 为紧急数据标志。如果它为1,表示本数据包中包含紧急数据。此时紧急数据指针有效。

ACK: 为确认标志位。如果为1,表示包中的确认号时有效的。否则,包中的确认号无效。

PSH: 如果置位,接收端应尽快把数据传送给应用层。

TCP连接的建立

TCP是一个面向连接的可靠传输协议。面向连接表示两个应用端在利用TCP传送数据前必须先建立TCP连接。 TCP的可靠性通过校验和,定时器,数据序号和应答来提供。通过给每个发送的字节分配一个序号,接收端接收到数据后发送应答,TCP协议保证了数据的可靠传输。数据序号用来保证数据的顺序,剔除重复的数据。在一个TCP会话中,有两个数据流(每个连接端从另外一端接收数据,同时向对方发送数据),因此在建立连接时,必须要为每一个数据流分配ISN(初始序号)。为了了解实现过程,我们假设客户端C希望跟服务器端S建立连接,然后分析连接建立的过程(通常称作三阶段握手):

1: C --SYN XXà S

2: C ?-SYN YY/ACK XX+1------- S

3: C ----ACK YY+1--à S

1:C发送一个TCP包(SYN 请求)给S,其中标记SYN(同步序号)要打开。SYN请求指明了客户端希望连接的服务器端端口号和客户端的ISN(XX是一个例子)。

2:服务器端发回应答,包含自己的SYN信息ISN(YY)和对C的SYN应答,应答时返回下一个希望得到的字节序号(YY+1)。

3:C 对从S 来的SYN进行应答,数据发送开始。

一些实现细节

大部分TCP/IP实现遵循以下原则:

1:当一个SYN或者FIN数据包到达一个关闭的端口,TCP丢弃数据包同时发送一个RST数据包。

2:当一个RST数据包到达一个监听端口,RST被丢弃。

3:当一个RST数据包到达一个关闭的端口,RST被丢弃。

4:当一个包含ACK的数据包到达一个监听端口时,数据包被丢弃,同时发送一个RST数据包。

5:当一个SYN位关闭的数据包到达一个监听端口时,数据包被丢弃。

6:当一个SYN数据包到达一个监听端口时,正常的三阶段握手继续,回答一个SYN ACK数据包。

7:当一个FIN数据包到达一个监听端口时,数据包被丢弃。"FIN行为"(关闭得端口返回RST,监听端口丢弃包),在URG和PSH标志位置位时同样要发生。所有的URG,PSH和FIN,或者没有任何标记的TCP数据包都会引起"FIN行为"。

二:全TCP连接和SYN扫描器

全TCP连接

全TCP连接是长期以来TCP端口扫描的基础。扫描主机尝试(使用三次握手)与目的机指定端口建立建立正规的连接。连接由系统调用connect()开始。对于每一个监听端口,connect()会获得成功,否则返回-1,表示端口不可访问。由于通常情况下,这不需要什么特权,所以几乎所有的用户(包括多用户环境下)都可以通过connect来实现这个技术。

这种扫描 *** 很容易检测出来(在日志文件中会有大量密集的连接和错误记录)。Courtney,Gabriel和TCP Wrapper监测程序通常用来进行监测。另外,TCP Wrapper可以对连接请求进行控制,所以它可以用来阻止来自不明主机的全连接扫描。

TCP SYN扫描

在这种技术中,扫描主机向目标主机的选择端口发送SYN数据段。如果应答是RST,那么说明端口是关闭的,按照设定就探听其它端口;如果应答中包含SYN和ACK,说明目标端口处于监听状态。由于所有的扫描主机都需要知道这个信息,传送一个RST给目标机从而停止建立连接。由于在SYN扫描时,全连接尚未建立,所以这种技术通常被称为半打开扫描。SYN扫描的优点在于即使日志中对扫描有所记录,但是尝试进行连接的记录也要比全扫描少得多。缺点是在大部分操作系统下,发送主机需要构造适用于这种扫描的IP包,通常情况下,构造SYN数据包需要超级用户或者授权用户访问专门的系统调用。

三:秘密扫描与间接扫描

秘密扫描技术

由于这种技术不包含标准的TCP三次握手协议的任何部分,所以无法被记录下来,从而必SYN扫描隐蔽得多。另外,FIN数据包能够通过只监测SYN包的包过滤器。

秘密扫描技术使用FIN数据包来探听端口。当一个FIN数据包到达一个关闭的端口,数据包会被丢掉,并且回返回一个RST数据包。否则,当一个FIN数据包到达一个打开的端口,数据包只是简单的丢掉(不返回RST)。

Xmas和Null扫描是秘密扫描的两个变种。Xmas扫描打开FIN,URG和PUSH标记,而Null扫描关闭所有标记。这些组合的目的是为了通过所谓的FIN标记监测器的过滤。

秘密扫描通常适用于UNIX目标主机,除过少量的应当丢弃数据包却发送reset信号的操作系统(包括CISCO,BSDI,HP/UX,MVS和IRIX)。在Windows95/NT环境下,该 *** 无效,因为不论目标端口是否打开,操作系统都发送RST。

跟SYN扫描类似,秘密扫描也需要自己构造IP 包。

间接扫描

间接扫描的思想是利用第三方的IP(欺骗主机)来隐藏真正扫描者的IP。由于扫描主机会对欺骗主机发送回应信息,所以必须监控欺骗主机的IP行为,从而获得原始扫描的结果。间接扫描的工作过程如下:

假定参与扫描过程的主机为扫描机,隐藏机,目标机。扫描机和目标记的角色非常明显。隐藏机是一个非常特殊的角色,在扫描机扫描目的机的时候,它不能发送任何数据包(除了与扫描有关的包)。

四:认证扫描和 *** 扫描

认证扫描

到目前为止,我们分析的扫描器在设计时都只有一个目的:判断一个主机中哪个端口上有进程在监听。然而,最近的几个新扫描器增加了其它的功能,能够获取监听端口的进程的特征和行为。

认证扫描是一个非常有趣的例子。利用认证协议,这种扫描器能够获取运行在某个端口上进程的用户名(userid)。认证扫描尝试与一个TCP端口建立连接,如果连接成功,扫描器发送认证请求到目的主机的113TCP端口。认证扫描同时也被成为反向认证扫描,因为即使最初的RFC建议了一种帮助服务器认证客户端的协议,然而在实际的实现中也考虑了反向应用(即客户端认证服务器)。

*** 扫描

文件传输协议(FTP)支持一个非常有意思的选项: *** ftp连接。这个选项最初的目的(RFC959)是允许一个客户端同时跟两个FTP服务器建立连接,然后在服务器之间直接传输数据。然而,在大部分实现中,实际上能够使得FTP服务器发送文件到Internet的任何地方。许多攻击正是利用了这个缺陷。最近的许多扫描器利用这个弱点实现ftp *** 扫描。

ftp端口扫描主要使用ftp *** 服务器来扫描tcp端口。扫描步骤如下:

1:假定S是扫描机,T是扫描目标,F是一个ftp服务器,这个服务器支持 *** 选项,能够跟S和T建立连接。

2:S与F建立一个ftp会话,使用PORT命令声明一个选择的端口(称之为p-T)作为 *** 传输所需要的被动端口。

3:然后S使用一个LIST命令尝试启动一个到p-T的数据传输。

4:如果端口p-T确实在监听,传输就会成功(返回码150和226被发送回给S)。否则S回收到"425无法打开数据连接"的应答。

5:S持续使用PORT和LIST命令,直到T上所有的选择端口扫描完毕。

FTP *** 扫描不但难以跟踪,而且当ftp服务器在_blank"防火墙后面的时候

五:其它扫描 ***

Ping扫描

如果需要扫描一个主机上甚至整个子网上的成千上万个端口,首先判断一个主机是否开机就非常重要了。这就是Ping扫描器的目的。主要由两种 *** 用来实现Ping扫描。

1:真实扫描:例如发送ICMP请求包给目标IP地址,有相应的表示主机开机。

2:TCP Ping:例如发送特殊的TCP包给通常都打开且没有过滤的端口(例如80端口)。对于没有root权限的扫描者,使用标准的connect来实现。否则,ACK数据包发送给每一个需要探测的主机IP。每一个返回的RST表明相应主机开机了。另外,一种类似于SYN扫描端口80(或者类似的)也被经常使用。

安全扫描器

安全扫描器是用来自动检查一个本地或者远程主机的安全漏洞的程序。象其它端口扫描器一样,它们查询端口并记录返回结果。但是它们。它们主要要解决以下问题:

1:是否允许匿名登录。

2:是否某种 *** 服务需要认证。

3:是否存在已知安全漏洞。

可能SATAN是最著名的安全扫描器。1995年四月SATAN最初发布的时候,人们都认为这就是它的最终版本,认为它不但能够发现相当多的已知漏洞,而且能够针对任何很难发现的漏洞提供信息。但是,从它发布以来,安全扫描器一直在不断地发展,其实现机制也越来越复杂。

栈指纹

绝大部分安全漏洞与缺陷都与操作系统相关,因此远程操作系统探测是系统管理员关心的一个问题。

远程操作系统探测不是一个新问题。近年来,TCP/IP实现提供了主机操作系统信息服务。FTP,TELNET,HTTP和DNS服务器就是很好的例子。然而,实际上提供的信息都是不完整的,甚至有可能是错误的。最初的扫描器,依靠检测不同操作系统对TCP/IP的不同实现来识别操作系统。由于差别的有限性,现在只能最多只能识别出10余种操作系统。

最近出现的两个扫描器,QueSO和NMAP,在指纹扫描中引入了新的技术。 QueSO之一个实现了使用分离的数据库于指纹。NMAP包含了很多的操作系统探测技术,定义了一个模板数据结构来描述指纹。由于新的指纹可以很容易地以模板的形式加入,NMAP指纹数据库是不断增长的,它能识别的操作系统也越来越多。

这种使用扫描器判断远程操作系统的技术称为(TCP/IP)栈指纹技术。

另外有一种技术称为活动探测。活动探测把TCP的实现看作一个黑盒子。通过研究TCP对探测的回应,就可以发现 TCP实现的特点。TCP/IP 栈指纹技术是活动探测的一个变种,它适用于整个TCP/IP协议的实现和操作系统。栈指纹使用好几种技术来探测TCP/IP协议栈和操作系统的细微区别。这些信息用来创建一个指纹,然后跟已知的指纹进行比较,就可以判断出当前被扫描的操作系统。

栈指纹扫描包含了相当多的技术。下面是一个不太完整的清单:

1:FIN探测

2:BOGUS标记探测

3:TCP ISN 取样

4:TCP 初始窗口

5:ACK值

6:ICMP错误信息

7:ICMP信息

8:服务类型

9:TCP选项

0条大神的评论

发表评论