扫描技术概论

1:什么是扫描器?

扫描器是一种自动检测远程或本地主机安全性弱点的程序,通过使用扫描器,用户可以不留痕迹的发现云成服务器的各个端口的分配以及提供的服务和它们的软件版本。通过使用扫描器,攻击者能够直接或直观的了解到远程主机所存在的安全问题。

2:扫描器的工作原理?

扫描器通过选用远程TCP/IP不同的端口的服务,并记录目标给予的回答来实现。搜集目标主机的有用信息,如
⑴是否能用匿名(anonymous)登陆。
⑵是否有可写的FTP目录。
⑶是否能用Telnet。
⑷HTTPD是用Root还是nobody在运行。

3:扫描器的作用?

扫描器并不是一个直接攻击网络漏洞的程序,它仅仅帮助入侵者发现目标主机的某些内在弱点。一个好的扫描器能对它得到的数据进行分析,帮助入侵者查找目标主机的漏洞。但它不会提供进入目标系统的详细步骤
。(如小榕的流光,Xfocus的X-san等)

4:扫描器的功能?

⑴发现一个主机或网络。
⑵发现该主机正在运行何种服务(如开放了哪些端口)
⑶通过测试这些服务,发现其内在的漏洞。

5:端口扫描技术?

⑴TCP connect()扫描

这是最基本的TCP扫描。connect()用来与每一个感兴趣的目标计算机的端口进行连接。如果端口处于侦听状态,那么connect()就能成功,反之,这个端口不能使用,即没有提供服务=失败。

它的优点是:

①入侵者不需要任何权限。系统中的任何用户都有权利使用这个调用。
②速度快。如果对每个目标端口以串行的方式,使用单独的connect()调用,那么将会花费很长的时间,入侵者可以通过同时打开多个套接口,从而加快扫描速度。使用非阻塞I/O允许入侵者设置一个低的时间用尽周期,同时观察多个套接口。但这种方法的缺点是容易被发觉,并且被过滤掉。目标计算机的日志文件也会记录一大堆的连接和连接是否出错的服务消息,并且能很快关闭。

⑵TCP SYN扫描

TCP connect()扫描需要建立一个完整的TCP连接,这样很容易被对方发现。TCP SYN技术通常被认为是“半开放”扫描,因为扫描程序不必打开一个完全的TCP连接。扫描程序发送一个SYN数据包,就好象准备打开一个实际的连接并等待ACK一样。(关于这里请参看后记以及HBU小组“小金”的文章)。如果返回SYN|ACK,表示端口处于侦听状态;如果返回RST,就表示端口没有处于侦听状态。如果收到一个SYN|ACK,则扫描程序必须再发送一个RST信号来关闭这个连接过程。TCP SYN扫描技术的优点就在于一般不会在目标计算机上留下记录。但它的前提是:必须要有Root权限才可以建立自己的SYN数据包。

⑶TCP FIN扫描

正常情况下,防火墙和包过滤器都会对一些指定的端口进行监视,并且可以检测和过滤掉TCP SYN扫描。但是,FIN数据包就可以没有任何阻拦的通过。这种扫描技术的思想是关闭的端口会用适当的RST来回复FIN数据包。另一方面,打开的端口会忽略对FIN数据包的回复。这里要注意的是:有的系统不管端口是否打开,都会回复RST信号,这种情况下,TCP FIN扫描就无法使用了。

⑷IP段扫描

它并不直接发送TCP探测数据包,而是将数据包分成两个比较小的IP段。这样就将一个TCP头分成好几个数据包,使过滤器很难探测到,从而到达我们的目的。(注:进一层的请参看“IP碎片攻击”一文)

6:端口扫描程序的编写?

下面是一个比较简单的端口扫描器源程序,它的功能仅仅是通过connect与目标连接,没有对返回的数据进行分析。仅供参考。

#include<stdio.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<errno.h>
#include<netdb.h>
#include<signal.h>

int main(int argc,char**argv>
{
int probeport=0;
struct hostent*host;
int err,i,net;
struct sockaddr_in sa;

if(argc!=2){
printf("usage:%s hostname\n",argv[0];
exit(1);
}
/* 扫描1~1024端口范围 */
for(i=1;i<1024;i++)
{
strncpy((char*)&sa,"",sizeof sa);
sa.sin_family=AF_INET;
if(isdigit(argv[1])) /* 如果是IP地址 */
sa.sin_addr.s_addr=int_addr(argv[1]);
else if ((host=gethostbyname(argv[1]))!=0 /* 如果是主机名,需要转换 */
strncpy((char*)&sa.sin_addr,(char*)host->h_addr,sizeof sa.sin_addr);
else {
herror(argv[1]);
exit(2);
}
sa.sin_port=htons(i);
/* 创建socket标识符 */
net=socket(AF_INET,SOCK_STREAM,0);
if (net<0){
perror("\nsocket");
exit(2);
}
/* 与目标主机连接 */
err=connect(net,(struct sockaddr *)&sa,sizeof sa);
if(err<0){
printf("%s %-5d %s\r",argv[1],i,strerror(errno);
fflush(stdout);
}else{
/* 如果连接成功,打印主机名和成功连接的端口号 */
printf("%s %-5d accepted.\n",argv[1],i);
if(shutdown(net,2)<0){
perror("\nshutown");
exit(2)
}
}
/* 关闭socket标识符 */
close(net);
}
printf("\r");
fflush(stdout);
return(0);
}


后记:关于TCP SYN扫描攻击的原理以及TCP连接和关闭的过程。

1:建立连接。

TCP协议使用三次握手来建立一个TCP连接。握手过程的第一个报文的代码位设置为SYN,序列号为X,表示开始一次握手。接收方收到以后想发送者回发一个确认报文。代码位设置为SYN和ACK,序列号为Y,确认序列号为X+1。发送者在收到确认报文后,知道可以发送TCP数据了,于是它又向接收者发送一个ACK报文,表示双方的连接已经建立。从这里我们可以看出,建立TCP连接至少需要三个分组,因此称为三次握手(Three-Way-Handshake)。在完成上述三次握手以后,就开始正式的数据传输。(注:握手报文中的序列号都是随机产生的)

2:关闭连接。

TCP的连接需用三个分组才可以建立,而终止一个连接则需要四个分组!为什么呢?

①某个应用进程首先调用close,称为主动关闭(Active Close)。这一端的TCP于是发送一个FIN分组,表示数据发送完毕。
②接收到FIN的另一端执行被动关闭(Passive Close)。这个FIN由TCP确认,并作为文件结束符传送给接收方应用进程,因为FIN意味着应用进程在此连接上再也接收不到额外的任何数据。
③一段时间后,接收到文件结束符的应用进程调用close,关闭其套接口。这导致它的TCP也发送一个FIN。
④接收到这个FIN的原发送方TCP对它进行确认。因此,每个方向都需要一个FIN和ACK,所以终止TCP连接需要四个分组。

3:TCP/SYN攻击

此前小金同志已经在他的文章里讲的非常详细了,我在这里主要介绍一下这种攻击技术的原理,不多罗嗦,想看详细的去www.s8s8.net吧。

TCP/SYN作为一种拒绝服务式攻击,它的原理是:当一台机器A要与另外一台机器ISP(internet service provider网际服务提供者)的主机B建立连接时,它的通信方式是先发一个SYN包告诉对方主机B,当B主机接收到以后,就回复一个ACK/SYN确认请求包给A主机。如果A主机是合法地址,就会再回复一个ACK包给B主机,然后两台主机就可以建立通信渠道了,也就是上面所说的三次握手建立TCP连接。但恶意攻击者发出SYN包的源地址是虚假的IP地址,ISP主机B回复的那个ACK/SYN包当然就找不到目标地址了,如果这个ACK/SYN包一直没有找到目标地址,那么也就是目标主机无法获得对方回复的ACK包。而在缺省超时的时间范围内,主机的一部分资源就要花在等待这个ACK包的响应上,假如短时间内主机B接收到大量来自虚假IP地址的SYN包,那么它就要占用大量的资源来处理这些错误的等待,最后的结果就是系统资源耗尽以至瘫痪。也就是说SYN攻击的关键还是TCP连接的三次握手过程。
原文地址:https://www.cnblogs.com/QDuck/p/69155.html