端口扫描的扫描方式_端口扫描设计思路

hacker|
139

Nmap 扫描原理及使用方法

Nmap 扫描原理及使用方法

Namp包含四项基本功能

Nmap基本扫描方法

2.1 用法引入

2.1.1确定端口状况

确定目标主机在线情况及端口基本状况。

命令形式:

namp targethost

2.1.2 完整全面的扫描

对主机进行完整全面的扫描,那么可以使用nmap内置的-A选项。使用该选项,nmap 对主机进行主机发现、端口扫描、应用程序与版本侦测、操作系统侦测及调用默认NSE脚本扫描。

1)命令形式:

nmap -T4 -A -v targethost

2)参数详解:

2.2 主机发现

2.2.1 主机发现原理

主机发现发现的原理与Ping命令类似,发送探测包到目标主机,如果收到回复,说明目标主机是开启的。

1)常见主机探测方式:

2)案例:

Nmap的用户位于源端,IP地址192.168.0.5,向目标主机192.168.0.3发送ICMP Echo Request。如果该请求报文没有被防火墙拦截掉,那么目标机会回复ICMP Echo Reply包回来。以此来确定目标主机是否在线。

3)默认情况下:Nmap会发送四种不同类型的数据包来探测目标主机是否在线。

依次发送四个报文探测目标机是否开启。只要收到其中一个包的回复,那就证明目标机开启。使用四种不同类型的数据包可以避免因防火墙或丢包造成的判断错误。

2.2.2 主机发现的用法

2.3 端口扫描

Namp通过探测将端口划分为6个状态:

2.3.1 端口扫描原理

2.3.1.1 TCP SYN scanning

TCP SYN scanning 是Nmap默认的扫描方式,称作半开放扫描。

原理:该方式发送SYN到目标端口。

2.3.1.2 TCP connect scanning

原理:TCP connect 方式使用系统网络API connect 向目标主机的端口发起连接。

优缺点:该方式扫描速度比较慢,而且由于建立完整的TCP连接会在目标机上留下记录信息,不够隐蔽。所以,TCP connect是TCP SYN无法使用才考虑选择的方式。

2.3.1.3 TCP ACK scanning

原理:向目标主机的端口发送ACK包。

优缺点:该方式只能用于确定防火墙是否屏蔽某个端口,可以辅助TCP SYN的方式来判断目标主机防火墙的状况。

2.3.1.4 TCP FIN/Xmas/NULL scanning

这三种扫描方式被称为秘密扫描(Stealthy Scan)

原理:FIN扫描向目标主机的端口发送的TCP FIN包或Xmas tree包/Null包

其中Xmas tree包是指flags中FIN URG PUSH被置为1的TCP包;NULL包是指所有flags都为0的TCP包。

2.3.1.5 UDP scanning

UDP扫描方式用于判断UDP端口的情况。

原理:向目标主机的UDP端口发送探测包。

2.3.2 端口扫描用法

2.3.2.1 扫描方式选项

2.3.2.2 端口参数与扫描顺序

2.4 版本侦测

2.4.1 优缺点

2.4.2 版本侦测原理

2.4.3 版本侦测用法

2.5 OS侦测

2.5.1 OS侦测原理

2.5.2 OS侦测用法

参考:

端口扫描的目的

端口扫描的目的是扫描大范围的主机连接一系列的TCP端口,判断主机开放了哪些服务,这些开放的端口往往与一定的服务相对应,通过这些开放的端口,就能了解主机运行的服务,然后就可以进一步整理和分析这些服务可能存在的漏洞,随后采取针对性的攻击。

端口扫描是指某些别有用心的人发送一组端口扫描消息,试图以此侵入某台计算机,并了解其提供的计算机网络服务类型(这些网络服务均与端口号相关)。端口扫描是计算机解密高手喜欢的一种方式。攻击者可以通过它了解到从哪里可探寻到攻击弱点。实质上,端口扫描包括向每个端口发送消息,一次只发送一个消息。接收到的回应类型表示是否在使用该端口并且可由此探寻弱点。

端口扫描原理

端口扫描,顾名思义,就是逐个对一段端口或指定的端口进行扫描。通过扫描结果可以知道一台计算机上都提供了哪些服务,然后就可以通过所提供的这些服务的己知漏洞就可进行攻击。其原理是当一个主机向远端一个服务器的某一个端口提出建立一个连接的请求,如果对方有此项服务,就会应答,如果对方未安装此项服务时,即使你向相应的端口发出请求,对方仍无应答,利用这个原理。

设计一个判断端口是否开启的扫描器程序的源代码怎么写?

for(int i=0;i6;i++)

{

for(int j=0;j10;j++)

{

theport[j].rmt_host=rmt_host;

theport[j].p=port[i*10+j];

theport[j].n=j;

Thread[j]=AfxBeginThread(pScan,(LPVOID)theport[j]);

//启动端口扫描线程

hThread[j]=Thread[j]-m_hThread;

Sleep(1);

}

WaitForMultipleObjects(10,hThread,TRUE,120000);

}

//扫描模块代码

SOCKET sockfd;

SOCKADDR_IN addr;

sockfd = socket(AF_INET, SOCK_STREAM, 0);

if (sockfd 0)

{

exit(0);

}

addr.sin_family = AF_INET;

addr.sin_port = htons(port);

addr.sin_addr.s_addr = inet_addr(rmt_host);

int r = connect(sockfd,(struct sockaddr *) addr, sizeof(addr));

//尝试连接端口进行检测

closesocket(sockfd);

//连接返回值处理

if (r!=-1)

{

::PostMessage(hWnd,WM_DISPLAY,port,0);

}

//显示端口扫描结果

LONG CScanDlg::OnDisplay(LONG lParam, UINT wParam)

{

LPSERVENT bar;

CString open;

int p=lParam;

bar = getservbyport(htons(p),"tcp");

open.Format("\t%d号端口(%s)开放!\r\n",p,(bar == NULL) ? "未知" :

bar-s_name);

m_HistoryEdit.AppendString (open);

return 0;

}

0条大神的评论

发表评论