C++ TCP端口扫描
差不多就是这样的吧
#include stdio.h
#include winsock.h
#pragma comment(lib,"wsock32.lib")
int main(int argc, char **argv)
{
SOCKET sd_client;
u_short iPortStart, iPortEnd, port;
struct sockaddr_in addr_srv;
char *pszHost;
WSADATA wsaData;
WORD wVersionRequested;
int err;
switch(argc)
{
case 2:
iPortStart = 0;
iPortEnd = 65535;
pszHost =argv[1];
break;
case 3:
iPortStart = iPortEnd = atoi(argv[2]);
pszHost =argv[1];
break;
case 4:
iPortStart = atoi(argv[2]);
iPortEnd = atoi(argv[3]);
pszHost =argv[1];
break;
default:
printf("正确的命令行参数:\n");
printf("[IP] 扫描所有端口\n");
printf("[IP] [端口]:扫描单个端口\n");
printf("[IP] [端口1] [端口2]:扫描端口1到端口2\n");
return 1;
}
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, wsaData );
if ( err != 0 )
{
printf("Error %d: Winsock not available\n", err);
return 1;
}
for(port=iPortStart; port=iPortEnd; port++)
{
sd_client = socket(PF_INET, SOCK_STREAM, 0);
if (sd_client == INVALID_SOCKET)
{
printf("no more socket resources\n");
return 1;
}
addr_srv.sin_family = PF_INET;
addr_srv.sin_addr.s_addr=inet_addr(pszHost);
addr_srv.sin_port = htons(port);
err = connect(sd_client, (struct sockaddr *) addr_srv, sizeof(addr_srv));
if (err == INVALID_SOCKET)
{
printf("不能连接此端口:%d\n", port);
closesocket(sd_client);
continue;
}
printf("扫描此端口成功:%d\n", port);
closesocket(sd_client);
}
WSACleanup();
return 0;
}
渗透测试之端口扫描
端口扫描:端口对应 *** 服务及应用端程序
服务端程序的漏洞通过端口攻入
发现开放的端口
更具体的攻击面
UDP端口扫描:
如果收到ICMP端口不可达,表示端口关闭
如果没有收到回包,则证明端口是开放的
和三层扫描IP刚好相反
Scapy端口开发扫描
命令:sr1(IP(dst="192.168.45.129")/UDP(dport=53),timeout=1,verbose=1)
nmap -sU 192.168.45.129
TCP扫描:基于连接的协议
三次握手:基于正常的三次握手发现目标是否在线
隐蔽扫描:发送不完整的数据包,不建立完整的连接,如ACK包,SYN包,不会在应用层访问,
僵尸扫描:不和目标系统产生交互,极为隐蔽
全连接扫描:建立完整的三次握手
所有的TCP扫描方式都是基于三次握手的变化来判断目标系统端口状态
隐蔽扫描:发送SYN数据包,如果收到对方发来的ACK数据包,证明其在线,不与其建立完整的三次握手连接,在应用层日志内不记录扫描行为,十分隐蔽, *** 层审计会被发现迹象
僵尸扫描:是一种极其隐蔽的扫描方式,实施条件苛刻,对于扫描发起方和被扫描方之间,必须是需要实现地址伪造,必须是僵尸机(指的是闲置系统,并且系统使用递增的IPID)早期的win xp,win 2000都是递增的IPID,如今的LINUX,WINDOWS都是随机产生的IPID
1,扫描者向僵尸机发送SYN+ACY,僵尸机判断未进行三次握手,所以返回RST包,在RST数据包内有一个IPID,值记为X,那么扫描者就会知道被扫描者的IPID
2,扫描者向目标服务器发送SYN数据包,并且伪装源地址为僵尸机,如果目标服务器端口开放,那么就会向僵尸机发送SYN+ACK数据包,那么僵尸机也会发送RST数据包,那么其IPID就是X+1(因为僵尸机足够空闲,这个就为其收到的第二个数据包)
3,扫描者再向僵尸机发送SYN+ACK,那么僵尸机再次发送RST数据包,IPID为X+2,如果扫描者收到僵尸机的IPID为X+2,那么就可以判断目标服务器端口开放
使用scapy发送数据包:首先开启三台虚拟机,
kali虚拟机:192.168.45.128
Linux虚拟机:192.168.45.129
windows虚拟机:192.168.45.132
发送SYN数据包:
通过抓包可以查看kali给linux发送syn数据包
linux虚拟机返回Kali虚拟机SYN+ACK数据包
kali系统并不知道使用者发送了SYN包,而其莫名其妙收到了SYN+ACK数据包,便会发RST包断开连接
也可以使用下列该命令查看收到的数据包的信息,收到对方相应的SYN+ACK数据包,scapy默认从本机的80端口往目标系统的20号端口发送,当然也可以修改
如果向目标系统发送一个 随机端口:
通过抓包的获得:1,kali向linux发送SYN数据包,目标端口23456,
2,Linux系统由自己的23456端口向kali系统的20号端口返回RST+ACK数据包,表示系统端口未开放会话结束
使用python脚本去进行scapy扫描
nmap做隐蔽端口扫描:
nmap -sS 192.168.45.129 -p 80,21,110,443 #扫描固定的端口
nmap -sS 192.168.45.129 -p 1-65535 --open #扫描该IP地址下1-65535端口扫描,并只显示开放的端口
nmap -sS 192.168.45.129 -p --open #参数--open表示只显示开放的端口
nmap -sS -iL iplist.txt -p 80
由抓包可知,nmap默认使用-sS扫描,发送SYN数据包,即nmap=nmap -sS
hping3做隐蔽端口扫描:
hping3 192.168.45.129 --scan 80 -S #参数--scan后面接单个端口或者多个端口.-S表示进行SYN扫描
hping3 192.168.45.129 --scan 80,21,25,443 -S
hping3 192.168.45.129 --scan 1-65535 -S
由抓包可得:
hping3 -c 100 -S --spoof 192.168.45.200 -p ++1 192.168.45.129
参数-c表示发送数据包的数量
参数-S表示发送SYN数据包
--spoof:伪造源地址,后面接伪造的地址,
参数-p表示扫描的端口,++1表示每次端口号加1,那么就是发送SYN从端口1到端口100
最后面跟的是目标IP
通过抓包可以得知地址已伪造,但对于linux系统(192.168.45.129)来说,它收到了192.168.45.200的SYN数据包,那么就会给192.168.45.200回复SYN+ACK数据包,但该地址却是kali伪造的地址,那么要查看目标系统哪些端口开放,必须登陆地址为kali伪造的地址即(192.168.45.200)进行抓包
hping3和nmap扫描端口的区别:1,hping3结果清晰明了
2,nmap首先对IP进行DNS反向解析,如果没成功,那么便会对其端口发送数据包,默认发送SYN数据包
hping3直接向目标系统的端口发送SYN数据包,并不进行DNS反向解析
全连接端口扫描:如果单独发送SYN数据包被被过滤,那么就使用全连接端口扫描,与目标建立三次握手连接,结果是最准确的,但容易被入侵检测系统发现
response=sr1(IP(dst="192.168.45.129")/TCP(dport=80,flags="S"))
reply=sr1(IP(dst="192.168.45.129")/TCP(dport=80,flags="A",ack=(response[TCP].seq+1)))
抓包情况:首先kali向Linux发送SYN,Linux回复SYN+ACK给kali,但kali的系统内核不清楚kali曾给linux发送给SYN数据包,那么kali内核莫名其妙收到SYN+ACK包,那么便会返回RST请求断开数据包给Linux,三次握手中断,如今kali再给Linux发ACK确认数据包,Linux莫名其妙收到了ACK数据包,当然也会返回RST请求断开数据包,具体抓包如下:
那么只要kali内核在收到SYN+ACK数据包之后,不发RST数据包,那么就可以建立完整的TCP三次握手,判断目标主机端口是否开放
因为iptables存在于Linux内核中,通过iptables禁用内核发送RST数据包,那么就可以实现
使用nmap进行全连接端口扫描:(如果不指定端口,那么nmap默认会扫描1000个常用的端口,并不是1-1000号端口)
使用dmitry进行全连接端口扫描:
dmitry:功能简单,但功能简便
默认扫描150个最常用的端口
dmitry -p 192.168.45.129 #参数-p表示执行TCP端口扫描
dmitry -p 192.168.45.129 -o output #参数-o表示把结果保存到一个文本文档中去
使用nc进行全连接端口扫描:
nc -nv -w 1 -z 192.168.45.129 1-100: 1-100表示扫描1-100号端口
参数-n表示不对Ip地址进行域名解析,只把其当IP来处理
参数-v表示显示详细信息
参数-w表示超时时间
-z表示打开用于扫描的模式
简述端口扫描原理
扫描器通过选用远程TCPIP不同的端口的服务,并记录目标给予的回答,通过这种 *** 可以搜集到很多关于目标主机的各种有用的信息;
指发送一组端口扫描消息,试图以此侵入某台计算机,并了解其提供的计算机 *** 服务类型。端口扫描是计算机解密高手喜欢的一种方式,攻击者可以发现可探寻到的攻击弱点。实质上端口扫描包括向每个端口发送消息,一次只发送一个消息,接收到的回应类型表示是否在使用该端口并且可由此探寻弱点;
扫描器是一种自动检测远程或本地主机安全性弱点的程序,通过使用扫描器你可以不留痕迹的发现远程服务器的各种TCP端口的分配及提供的服务和软件版本,这就能间接的或直观的发现到远程主机所存在的安全问题。
描述使用Nmap对系统进行 *** 端口扫描的过程
【实验过程]】
将实验指导书的实验过程缩写,重点在于写出实验执行的具体步骤,以下是一个实验的书写实例:
1、 运行实验工具目录下的Nmap安装程序,安装Nmap到系统中的默认路径
2、 主机发现:运行如下命令:Nmap –sP 192.168.80.201,来判断目标主机Windows
Server A是否可连通
3、 使用常规扫描方式对目标主机进行TCP端口扫描,运行如下命令:Nmap –sT
192.168.80.201
4、 使用SYN半扫描方式,对目标主机进行TCP端口扫描,运行如下命令:Nmap –sS
192.168.80.201
5、 对主机进行UDP端口扫描,运行如下命令:Nmap –sV 192.168.80.201
6、 探测目标主机的操作系统类型,运行如下命令:Nmap –O –P0 192.168.80.201
7、 运行Namp的图形化前端程序Nmap,在“Target”中输入扫描目标的IP地址
(192.168.80.201),然后在Profile预定义配置下拉框中选择配置“Intense Scan , no Ping”,然后点击菜单项“Profile”-“Edit Selected Profile”,切换到“Scan”选项卡,勾选上“Operation system detection”和“Version detection”,然后点击“Save Changes”按钮保存扫描配置,最后点击“Scan”按钮开始扫描。
具体参考
采用tcp syn扫描的 *** 进行端口扫描,存在哪些优点和缺点
呵呵,我来简单回答一下吧!
首先你搞错了一个问题,就是没有syn扫描这种东西,只有tcp扫描和udp扫描。而tcp扫描一般是使用tcp的syn数据包来进行的,也就是不严格地说,你说的这两个是同一个东西,呵呵!
所以我在这里详细地解释一下tcp扫描和udp扫描以及它们的区别,希望能对你有所帮助。
tcp端口扫描是通过syn数据包进行的,用于扫描目标机器的端口上是否存在程序监听,通常意义上,普通个人机器上的某个端口如果有程序监听的话,那么它一般是系统漏洞。由于tcp是一个有连接的可靠协议,所以要使用三次握手来建立连接,三次握手的报文分别是(syn)、(ack
syn)和(ack)。进行端口扫描时,首先向对方主机的某一端口发送(syn)报文,如果对方这一端口上有程序在监听(或者说存在漏洞),则回复(syn
ack)报文,否则回复(rst)报文。据此就可以判断对方端口上是否有程序在监听了,或者是否存在漏洞了。
udp端口扫描是通过普通数据包进行的,也是用于扫描对方端口上是否有程序在运行,就像上面所说的,如果普通个人机器上存在这样的端口,那一般也是系统漏洞。但对于udp来说,不存在监听这个概念,因为它是无连接不可靠的协议,发送数据包过去以后,通常也不会有任何的对等回应。因此,udp端口扫描主要是检测是否存在icmp端口不可达数据包。若该数据包出现,则说明对方这一端口上没有程序在监听,或者说该端口不存在漏洞,否则就说明该端口上有程序在监听,或者说存在漏洞。
呵呵,现在可以总结一下他们的区别了,主要是以下几点:
1.
tcp是有连接的协议,而udp是无连接的;
2.
tcp扫描检测(ack
syn)或者是(rst)报文,而udp检测icmp端口不可达报文;
3.
tcp协议是可靠但低效的,可以有效进行端口扫描,范围广,效率低,可以应用于任何 *** 中;udp协议时不可靠但高效的,范围小,效率高,一般应用于局域网内部,随着 *** 规模的增大,udp端口扫描的结果准确度会越来越差,极端情况是,如果对internet使用udp端口扫描,所得到的结果一定不准确。
呵呵,回答完毕,希望能对你有所帮助!
0条大神的评论