**
隐蔽端口扫描:
**
一、我们使用scapy扫描,因为syn包的发送是在tcp的flag中决定的,所以我们要构造tcp包,tcp包由ip和tcp包头组成。
root@kali:~# scapy
WARNING: No route found for IPv6 destination :: (no default route?)
Welcome to Scapy (2.3.2)
>>> a=sr1(IP(dst="192.168.19.131")/TCP(flags="S"),timeout=1,verbose=0) //发送syn包。
>>> a.display()
###[ IP ]###
version= 4L
ihl= 5L
tos= 0x0
len= 40
id= 989
flags= DF
frag= 0L
ttl= 64
proto= tcp
chksum= 0x8e9e
src= 192.168.19.131
dst= 192.168.19.129
\options\
###[ TCP ]###
sport= http
dport= ftp_data
seq= 0
ack= 1
dataofs= 5L
reserved= 0L
flags= RA //RST,ACK。说明目标的80端口未开放,但是机器是存活的。
window= 0
chksum= 0x717
urgptr= 0
options= {}
###[ Padding ]###
load= '\x00\x00\x00\x00\x00\x00'
我们用wireshark查看一下:
我们查看一个开放的ip:
我们首先用nmap查看目标主机开放了什么端口。
>>> a=sr1(IP(dst="192.168.19.1")/TCP(flags="S",dport=902),timeout=1)
Begin emission:
.Finished to send 1 packets.
*
Received 2 packets, got 1 answers, remaining 0 packets
我们看到我们先是发送了一个syn包,然后目标主机发送给我们一个syn、ack包,表示对方主机在线并且端口开放。
注意:第三个tcp的包不是两台机器之间产生的包,他是由操作系统内核产生的,目标系统不知道我们用scapy发了一个数据包,当目标系统接受到了一个syn包之后会返回一个syn+ack包,但是扫描机器会认为这是一个没有任何原因就发送过来的包,所以扫描机器会返回一个RST包。
二、nmap扫描
root@kali:~# nmap 192.168.19.1 -p1-100 --open //扫描主机 192.168.19.1 1到100是否开放并且只显示open的端口
root@kali:~# nmap -sS 192.168.19.1 -p1-100 --open //加不加-sS 一样。
root@kali:~# nmap -sS 192.168.19.1 -p 80,50,60 //用,隔开端口
三、hping3
root@kali:~# hping3 -c 10 -S --spoof 192.168.1.140 -p ++1 192.168.131 //-c 指定发包属性 -S 发送syn包
--spoof 伪造ip -p指定端口 ++1指定扫描端口+1
但是这种扫描我可以扫描目标主机,对方主机也可以给我们回包,但是返回的信息给了伪造的ip,如果我们想查看ip只能登陆到140的主机查看。
**
全连接端口扫描:
**
如果我们隐蔽端口扫描未扫描到端口,我们可以进行全连接端口扫描即tcp三次握手,全连接扫描很准确但是会被发现。
如果我们用scapy进行三次握手建立,当我们发给目标机器一个syn的时候,对方给我发送一个syn+ack包,此时主机的内核会自动发送一个RST包给目标机器来终止此次连接。
如何解决?
我们可以用python来写脚本,具体过程在这里就不叙述了,在以后的python模块会详细说明。
nmap工具可以解决这个问题:
root@kali:~# nmap -sT 192.168.19.1 //-T 参数表示使用Tcp全连接扫描
dmitry:
root@kali:~# dmitry -p 192.168.19.1 //-p tcp端口扫描