Kali Linux 渗透测试:端口扫描工具 上 TCP半连接(9)

一、UDP端口扫描

原理:回应ICMP不可达,代表端口关闭;没有回应,端口开启

建议了解应用层的UDP包头结构,构建对应的UDP数据包用来提高准确度

另外:所有的扫描都存在误判情况

 

1、scapy

我们用Scapy写个脚本来试试:

#!/usr/bin/python
import logging

logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import *
import time
import sys

if len(sys.argv) != 4:
    print "./udp_scan.py [target ip] [first port] [last port]"
    print "example ./udp_scan.py 10.0.0.5 1 100"
    print "example will UDP port scan ports 1 to 100 on 10.0.0.5"

ip = sys.argv[1]
start = int(sys.argv[2])
end = int(sys.argv[3])

for port in range(start, end):
    a = sr1(IP(dst=ip) / UDP(dport=port), timeout=5, verbose=0)
    time.sleep(1)
    if a == None:
        print port
    else:
        pass

 

如果是从WINDOWS复制过去的:

vi udp_scan.py
:set fileformat=unix
:wq
chmod u+x udp_scan.py

 

执行:

./udp_scan.py 10.0.0.0 1 100

 

2、Nmap

接下来看看使用最强大的Nmap:

Nmap在端口扫描方面使用-sU参数

而我们使用Nmap如果不指定任何端口的话,他会扫描定义好的1000个常用端口

root@kali:~# nmap -sU 192.168.22.1

nmap udp端口扫描

 

当然也可以指定端口扫描:

root@kali:~# nmap  192.168.192.168 -p80

nmap udp端口扫描

 

如果你一定要扫描全部端口,也是可以的:

root@kali:~#  nmap 192.168.192.168 -p1-65535

nmap udp端口扫描

 

二、TCP端口扫描

好的,接下来我们看TCP端口扫描:

基于连接协议扫描:

所有的扫描都是基于三次握手的变化来判断目标端口状态

 

1、scapy

首先我们先用SCAPY演示:

我开启一个Metasploitable的虚拟机,查看到它的IP:192.168.22.129

再查看下Kali虚拟机的IP:192.168.22.130

 

首先我们先用SCAPY演示:

我开启一个Metasploitable的虚拟机,查看到它的IP:192.168.22.129

再查看下Kali虚拟机的IP:192.168.22.130

 

打开Scapy测试:

我们主动发一个SYN包,只要回应SYN+ACK包,就代表端口开启,

我们不能继续回应ACK包,而要回复RST断开连接防止被发现!Scapy SYN+ACK包

 

第一行的意思是发送一个TCP数据包将返回值赋给a

然后我们查看下这个a包:发现默认扫描80端口,并且返回SYN+ACK

我们为什么这里不主动回RST包呢?

原因:可以抓包发现,操作系统会自动回复给"莫名其妙"的TCP包RST

 

接下来我们换个端口扫描:22Scapy端口扫描22

 

这种情况也说明这里的22端口是开放的。

 

那么如果我们扫描一个关闭的端口呢?scapy扫描关闭端口

 

发现目标机器回复的是一个RST+ACK

代表:这台机器是活着的,但是当前扫描的端口(22222)是没有开放的

 

我们在scapy的基础上写一个简单的扫描脚本:syn_scan.py

#!/usr/bin/python
import logging

logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import *
import time
import sys

if len(sys.argv) != 4:
    print "./syn_scan.py [target ip] [first port] [last port]"
    print "example ./udp_scan.py 10.0.0.5 1 100"
    print "example will TCP SYN scan ports 1 to 100 on 10.0.0.5"

ip = sys.argv[1]
start = int(sys.argv[2])
end = int(sys.argv[3])

for port in range(start, end):
    a = sr1(IP(dst=ip) / TCP(dport=port), timeout=1, verbose=0)
    time.sleep(1)
    if a == None:
        pass
    else:
        if int(a[TCP].flags)==18:
            print  port
        else:
            pass

 

难点:这里为什么flags==18?

抓包发现SYN和ACK分别是2和2的4次方即为16,加在一起恰好为18

 

使用这个脚本:

老规矩,如果是windows转移过去的:

vi syn_scan.py
:set fileformat=unix
:wq
chmod u+x syn_scan.py

 

执行:

./syn_scan.py 10.0.0.0 1 100

scapy

 

这里并没有扫描完全,不过效果达到了(如果扫windows端口,1-100不会有任何开放端口)

 

隐蔽端口扫描这种方式其实比UDP的方式稳多了

 

2、nmap

当然,强大的Nmap也可以实现:而且效率更高

不过扫描原理就是上边写的内容

 

无参数扫描:

root@kali:~# nmap 192.168.22.129 -p1-100

nmap无参数扫描

使用后发现比自己搞的脚本快太多,而且完善,真不愧是强大的Nmap。

 

这里我们扫描的机器没有防火墙,所以扫描到的端口都是open的,如果存在close或filter,我们需要一个参数才能获取open的端口:

root@kali:~# nmap 192.168.22.129 -p1-100 --open

nmap扫描open的端口

 

nmap还可以加上一个参数:-sS:

root@kali:~# nmap -sS 192.168.22.129 -p1-100 --open

nmap扫描open的端口-sS

 

其实和默认方式是一样的,所以直接使用即可!

 

如果需要全部扫描:nmap [ip] -p -65535

如果需要扫描指定端口:nmap [ip] -p 80,22,...,139

 

3、hping3

其他端口扫描方式:Hping3

root@kali:~# hping3 192.168.22.129 --scan 1-100 -S

hping3 端口扫描

-S表示用SYN扫描,flags的S,A当然就代表SYN和ACK了

 

下面来个有趣的:

root@kali:~# hping3 -c 100 -S --spoof 192.168.168.168 -p ++1 192.168.22.129

hping3 端口扫描

 

先解释下这行命令:-c 100发送一百个包,和-p ++1组合,意味对端口1-100分别发送SYN包,

有趣在--spoof参数,伪造源IP地址,我这台机器无法查看扫描结果,只有我登陆伪造的192.168.168.168机器才可以查看结果。

其实下边这十几行都没有用

 

这种方式有很大的优点也有很大的缺点:

优点:非常隐蔽,基本不会被发现,在目标看来是另外一个机器发送的探测数据包

缺点:麻烦,需要另外一台机器

 

总结:

此文章下半部分讲的的都是TCP半连接端口扫描,接下来,我们会给大家看看TCP全连接端口扫描。

请继续关注下一篇文章!

头像
  • ¥ 298.0元
  • 市场价:498.0元
  • ¥ 199.0元
  • 市场价:499.0元
  • ¥ 498.0元
  • 市场价:498.0元
  • ¥ 159.0元
  • 市场价:599.0元

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: