tcp端口扫描的基本原理_tcp端口扫描c语言

hacker|
107

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

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是代理服务器端口

100分求linux下C语言端口扫描代码

linux tcp udp 端口扫描源程序

#include sys/socket.h

#include netinet/in.h

#include arpa/inet.h

#include unistd.h

#include errno.h

#include netdb.h

#include stdio.h

#include string.h

#include netinet/ip_icmp.h

#include stdlib.h

#include signal.h

#include libxml/parser.h

#include libxml/tree.h

#define TRUE 1

#define FALSE 0

#define UDP "UDP"

#define TCP "TCP"

#define tcp "tcp"

#define udp "udp"

typedef struct _GsSockStru{

int fd;

int len;

struct sockaddr_in addr;

}GsSockStru;

static int tcptest( char ip[32], char port[20]);

static int udptest( char ip[32], char port[20]);

void sig_alrm( int signo );

static GsSockStru test_sock;

int

main( int argc, char** argv)

{

char string[64];

char port[20];

char pro[20];

char ip[32];

int res;

int i = 0;

int k = 0;

if( argc2 || argc2 )

{

printf("鍙傛暟涓嶆纭?-1\n");

return ( -1 );

}

strcpy( string, argv[1]);

while( *string )

{

if( string[i] == ':' )

break;

pro[k] = string[i];

k++;

i++;

}

pro[k] = '\0';

i++;

k = 0;

while( *string )

{

if( string[i] == ':')

break;

ip[k] = string[i];

k++;

i++;

}

ip[k] = '\0';

i++;

k=0;

while( *string )

{

if( string[i] == '\0')

break;

port[k] = string[i];

k++;

i++;

}

port[k] = '\0';

i++;

memset( test_sock, 0, sizeof( test_sock ) );

if ( ( strcmp( TCP, pro) != 0 ) ( strcmp( UDP, pro) != 0 ) ( strcmp( tcp, pro) != 0 ) ( strcmp( udp, pro) != 0 ))

{

printf ( "鍙傛暟涓嶆纭?锛?\n" );

return (-1);

}

if ( strcmp( TCP, pro) == 0 || strcmp( tcp, pro) == 0 )

res = tcptest( ip, port );

if ( strcmp( UDP, pro) == 0 || strcmp( udp, pro) == 0 )

res = udptest( ip, port );printf("%d\n",res);

return ( res );

}

int

tcptest( char ip[32], char port[20])

{

int res;

struct timeval tv;

test_sock.fd = socket( AF_INET, SOCK_STREAM, 0 );

if ( test_sock.fd 0 )

{

printf( "create socket failed -3 \n" );

return ( -3 );

}

memset( ( test_sock.addr ), 0, sizeof( test_sock.addr ) );

test_sock.addr.sin_family = AF_INET;

test_sock.addr.sin_port = htons( atoi( port ) );

inet_pton( AF_INET, ip, test_sock.addr.sin_addr );

test_sock.len = sizeof( struct sockaddr );

tv.tv_sec = 10;

tv.tv_usec = 0;

setsockopt( test_sock.fd, SOL_SOCKET, SO_RCVTIMEO,

(const char *)tv, sizeof( tv ) );

res = connect( test_sock.fd,

( struct sockaddr * )( ( test_sock.addr ) ),

test_sock.len );

if ( res 0 )

{

fprintf( stderr, "connect failed 0\n" );

close( test_sock.fd );

return FALSE;

}

close( test_sock.fd );

return TRUE;

}

int udptest( char ip[32], char port[20])

{

struct icmphdr *icmp_header;

struct sockaddr_in target_info;

int target_info_len;

fd_set read_fd;

int scan_port;

char recvbuf[5000];

struct sockaddr_in target_addr;

int icmp_socket;

int udp_socket;

struct timeval tv;

icmp_header = (struct icmphdr *)(recvbuf+sizeof(struct iphdr));

scan_port = atoi( port );

target_addr.sin_family = AF_INET;

inet_pton( AF_INET, ip, target_addr.sin_addr );

target_addr.sin_port = htons(scan_port);

if ((udp_socket=socket(AF_INET,SOCK_DGRAM,0))==-1)

{

printf("create socket failed -3\n");

return -3;

}

if ((icmp_socket=socket(AF_INET,SOCK_RAW,IPPROTO_ICMP))==-1)

{

printf("Create raw socket failed -3\n");

return -3;

}

sendto(udp_socket,NULL,0,0,(void *)target_addr,sizeof(target_addr));

FD_ZERO(read_fd);

FD_SET(icmp_socket,read_fd);

tv.tv_sec = 1;

tv.tv_usec = 0;

select(FD_SETSIZE,read_fd,NULL,NULL,tv);

for (;;){

if (FD_ISSET(icmp_socket,read_fd))

{

target_info_len = sizeof(target_info);

recvfrom(icmp_socket,recvbuf,5000,0,

(struct sockaddr *)target_info,target_info_len);

if (target_info.sin_addr.s_addr == target_addr.sin_addr.s_addr

icmp_header-type == 3 icmp_header-code=12)

{

printf("Port %d : Close\n",scan_port);

return (0);

}

}

return (1) ;

}

}

什么是端口扫描?

一个端口就是一个潜在的通信通道,也就是一个入侵通道。对目标计算机进行端口扫描,能得到许多有用的信息。进行扫描的方法很多,可以是手工进行扫描,也可以用端口扫描软件进行。 在手工进行扫描时,需要熟悉各种命令。对命令执行后的输出进行分析。用扫描软件进行扫描时,许多扫描器软件都有分析数据的功能。 通过端口扫描,可以得到许多有用的信息,从而发现系统的安全漏洞。 什么是扫描器 扫描器是一种自动检测远程或本地主机安全性弱点的程序,通过使用扫描器你可一不留痕迹的发现远程服务器的各种TCP端口的分配及提供的服务和它们的软件版本!这就能让我们间接的或直观的了解到远程主机所存在的安全问题。 工作原理 扫描器通过选用远程TCP/IP不同的端口的服务,并记录目标给予的回答,通过这种方法,可以搜集到很多关于目标主机的各种有用的信息(比如:是否能用匿名登陆!是否有可写的FTP目录,是否能用TELNET,HTTPD是用ROOT还是nobady在跑!) 扫描器能干什么 扫描器并不是一个直接的攻击网络漏洞的程序,它仅仅能帮助我们发现目标机的某些内在的弱点。一个好的扫描器能对它得到的数据进行分析,帮助我们查找目标主机的漏洞。但它不会提供进入一个系统的详细步骤。 扫描器应该有三项功能:发现一个主机或网络的能力;一旦发现一台主机,有发现什么服务正运行在这台主机上的能力;通过测试这些服务,发现漏洞的能力。 编写扫描器程序必须要很多TCP/IP程序编写和C, Perl和或SHELL语言的知识。需要一些Socket编程的背景,一种在开发客户/服务应用程序的方法。开发一个扫描器是一个雄心勃勃的项目,通常能使程序员感到很满意。 常用的端口扫描技术 TCP connect() 扫描 这是最基本的TCP扫描。操作系统提供的connect()系统调用,用来与每一个感兴趣的目标计算机的端口进行连接。如果端口处于侦听状态,那么connect()就能成功。否则,这个端口是不能用的,即没有提供服务。这个技术的一个最大的优点是,你不需要任何权限。系统中的任何用户都有权利使用这个调用。另一个好处就是速度。如果对每个目标端口以线性的方式,使用单独的connect()调用,那么将会花费相当长的时间,你可以通过同时打开多个套接字,从而加速扫描。使用非阻塞I/O允许你设置一个低的时间用尽周期,同时观察多个套接字。但这种方法的缺点是很容易被发觉,并且被过滤掉。目标计算机的logs文件会显示一连串的连接和连接是出错的服务消息,并且能很快的使它关闭。 TCP SYN扫描 这种技术通常认为是“半开放”扫描,这是因为扫描程序不必要打开一个完全的TCP连接。扫描程序发送的是一个SYN数据包,好象准备打开一个实际的连接并等待反应一样(参考TCP的三次握手建立一个TCP连接的过程)。一个SYN|ACK的返回信息表示端口处于侦听状态。一个RST返回,表示端口没有处于侦听态。如果收到一个SYN|ACK,则扫描程序必须再发送一个RST信号,来关闭这个连接过程。这种扫描技术的优点在于一般不会在目标计算机上留下记录。但这种方法的一个缺点是,必须要有root权限才能建立自己的SYN数据包。 TCP FIN 扫描 有的时候有可能SYN扫描都不够秘密。一些防火墙和包过滤器会对一些指定的端口进行监视,有的程序能检测到这些扫描。相反,FIN数据包可能会没有任何麻烦的通过。这种扫描方法的思想是关闭的端口会用适当的RST来回复FIN数据包。另一方面,打开的端口会忽略对FIN数据包的回复。这种方法和系统的实现有一定的关系。有的系统不管端口是否打开,都回复RST,这样,这种扫描方法就不适用了。并且这种方法在区分Unix和NT时,是十分有用的。 IP段扫描 这种不能算是新方法,只是其它技术的变化。它并不是直接发送TCP探测数据包,是将数据包分成两个较小的IP段。这样就将一个TCP头分成好几个数据包,从而过滤器就很难探测到。但必须小心。一些程序在处理这些小数据包时会有些麻烦。 TCP 反向 ident扫描 ident 协议允许(rfc1413)看到通过TCP连接的任何进程的拥有者的用户名,即使这个连接不是由这个进程开始的。因此你能,举

怎么样用出C语言写一个分析TCP/IP报文的程

socket编程写了一个简单的DNS服务器。

是这样实现的,用两台PC,一个做客户端,一个做服务器;

在服务器用socket监视53端口,recvfrom()函数负责接收DNS查询报文,将其存入事先写好的数据结构里;

因为DNS查询报文和应答报文的前部分字段格式都是一样的,只是修改了几个参数,然后重点把DNS应答报文后面的字段进行增添。

然后用sendto();函数发送就可以了。

在ie里面输入任意的网址,回车,就会触发客户端向服务器发出DNS查询报文,

此时你可以同时在服务器和客户端抓包,看收到的报文是否正确。

注意几点:

1、一定要熟悉报文结构,定义合适的结构体,将报文进行解析

2、一定要注意网络序和主机序的转换htonl(),htons(),ntohl(),ntohs()等

3、找个熟知端口,最好是你熟悉的协议,如ftp,http,dns等。

4、客户端要把DNS服务器配置为你的服务器ip。

0条大神的评论

发表评论