十四、主动信息收集-端口扫描

1.UDP端口扫描

前提:基于已发现的存活主机
假设ICMP port unreachable响应代表端口关闭
目标系统不响应ICMP port unreachable时,可能产生误判

  • 完整的UDP应用层请求
    • 准确性高
    • 耗时巨大

1.1 scapy udp scan

  • 端口关闭:通过ICMP port unreachable
  • 端口开放:没有回包
  • 存在误判

(1)编写udp_scan脚本

#!/usr/bin/python

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

if len(sys.argv) != 4:
    print "Usage - ./udp_scan.py[start port && end port]"
    print "Example - ./udp_scan.py 1.1.1.1 1-200"
    print "Example will preform an ICMP scan of the 1.1.1.0 is assigned"
    sys.exit()

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=3,verbose=0)
    time.sleep(1)
    if a == None:
        print port
    else:
        pass

查看扫描后结果(以metasploitable2为目标主机):

扫描结果

1.2 nmap udp scan

nmap -sU 192.168.50.183
nmap 192.168.50.183 -sU -p53    //指定端口扫描
  • nmap默认扫描1000个常用端口
  • 利用ICMP host unreachable

2.TCP端口扫描

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

  • 基于连接的协议
  • 三次握手
  • 全连接扫描
  • 2.1 隐蔽扫描
  • 不建立完整连接 syn---syn/ack---rst
  • 应用日志不记录扫描行为--隐蔽
  • 2.1.1隐蔽扫描-scapy脚本实现
>>>a=sr1(IP(dst="192.168.50.183")/TCP(flags="S"),timeout=0,verbose=0)   //发送标志位为SYN的tcp包
>>> a.display()
###[ IP ]### 
  version= 4L
  ihl= 5L
  tos= 0x0
  len= 44
  id= 0
  flags= DF
  frag= 0L
  ttl= 64
  proto= tcp
  chksum= 0x5451
  src= 192.168.50.183
  dst= 192.168.50.115
  \options\
###[ TCP ]### 
     sport= http   //默认是80端口
     dport= ftp_data
     seq= 2348057631
     ack= 1
     dataofs= 6L
     reserved= 0L
     flags= SA   //返回包为syn+ack,标明端口是开放的
     window= 5840
     chksum= 0x8a52
     urgptr= 0
     options= [('MSS', 1460)]

从下面的抓包可以看见,返回了syn+ack,但是下面的RST并不是由于scapy产生的,而是由主机系统内核自己发出的rst


syn扫描抓包
#!/usr/bin/python

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

if len(sys.argv) != 4:
    print "Usage - ./syn_scan.py[start port && end port]"
    print "Example - ./syn_scan.py 1.1.1.1 1-200"
    print "Example will preform an ICMP scan of the 1.1.1.0 is assigned"
    sys.exit()

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)
    if a == None:
        pass
    else:
        if int(a[TCP].flags) == 18:   //syn+ack位为1时,值为18
            print port
        else:
            pass
扫描结果
  • 2.1.2 隐蔽扫描-nmap
nmap -sS 1.1.1.1 -p 80,21,25,443  //多个指定端口扫描

nmap -sS 1.1.1.1 -p 1-65535 --open

nmap -sS 1.1.1.1 -p - --open  //扫描1-65535并处于open状态的端口

nmap -sS -iL iplist.txt -p 80,21,23,53  
nmap扫描
  • 2.1.2 隐蔽扫描-hping3
hping3 1.1.1.1 --scan 80 -S  //发送syn包

hping3 1.1.1.1 --scan 80,21,25,443 -S

hping3 1.1.1.1 --scan 0-65535 -S

hping3 -c 100 -S --spoof 1.1.1.2 -p ++1 1.1.1.3  //发送100以内端口,++1逐个递加,并以伪造原地址为1.1.1.2去发送给1.1.1.3
hping3端口扫描

抓包结果
伪造源地址扫描

欺骗源地址抓包
  • 2.2 僵尸扫描
  • 极度隐蔽
  • 实施条件苛刻
  • 可伪造源地址
  • 选择僵尸机
  • 闲置系统
  • 系统使用递增的IPID(ip包头中的Identification,而0或随机产生的情况是无法实现僵尸扫描的)
  • 2.2.1 原理

①原理图--目标主机端口开放状态下

端口开放时

②原理图--目标主机端口关闭状态下

端口关闭时
  • 2.2.2 实验1
    *192.168.50.115(scanner扫描机)---------192.168.50.185(zombie僵尸机)---------192.168.50.183(target靶机) *

注:windows xp、windows server2003及以下可以用于zombie僵尸机,而linux或是更高版本的windows的ipid是随机的,无法用来完成此次实验。

>>> i=IP()
>>> t=TCP()
>>> rz=(i/t)
>>> rt=(i/t)
>>> rz[IP].dst="192.168.50.185"
>>> rz[TCP].dport=445
>>> rz[TCP].flags="SA"   //向zombie机发送syn+ack,此时zombie后返回reset
>>> rt[IP].src="192.168.50.185"
>>> rt[IP].dst="192.168.50.183"
>>> rt[TCP].dport=21
>>> rt[TCP].flags="S"  //以伪造zombie源地址发送syn给target,target会返回给zombie一个syn+ack,而zombie会返回给target一个reset

***观察结果***
>>>az1=sr1(rz)   //发送给zombie,返回ipidentification为1
###[ IP ]### 
  version= 4L
  ihl= 5L
  tos= 0x0
  len= 40
  id= 166  //id为166
  flags= 
  frag= 0L
  ttl= 128
  proto= tcp
  chksum= 0x53ad
  src= 192.168.50.185
  dst= 192.168.50.115

>>>at=sr1(rt,timeout=1)  //发送给taget,返回ipididentification为2
>>>az2=sr1(rz)   //再次发送给zombie,返回ipididentification为3
###[ IP ]### 
  version= 4L
  ihl= 5L
  tos= 0x0
  len= 40
  id= 168  //id为168
  flags= 
  frag= 0L
  ttl= 128
  proto= tcp
  chksum= 0x53ab
  src= 192.168.50.185
  dst= 192.168.50.115

查看抓包结果:

僵尸扫描抓包结果

当target端口(rt[TCP].dport=20325)不开放时,其id值相差为1

端口不开放下
  • 2.2.3脚本实现僵尸扫描

上述是通过scapy命令行的方式实现的扫描,下面使用脚本的方式对其进行僵尸扫描,代码如下:

#!/usr/bin/python

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

def ipid(zombie):  
    reply1 = sr1(IP(dst=zombie)/TCP(flags="SA"),timeout=2,verbose=0)
    send(IP(dst=zombie)/TCP(flags="SA"),verbose=0)
    reply2 = sr1(IP(dst=zombie)/TCP(flags="SA"),timeout=2,verbose=0)
    
    if reply2[IP].id == (reply1[IP].id + 2):      //探测是否满足zombie僵尸机
        print "IPID sequence is incremental and target appears to be idle,ZOMBIE located"
        response = raw_input("Do you want to use this zombie to perform a scan?(Y or N):")
        if response == "Y":
            target = raw_input("Enter the IP address of the target system:")
            zombiescan(target,zombie)
    else:
        print " Either the IPID sequence is not incremental or the target is not idle,not a good zombie"

def zombiescan(target,zombie):  //对target进行僵尸扫描
    print "\nScanning target" + target +"with zombie" + zombie 
    print "\n-------------Open Port on Target ----------------\n"
    for port in range(1,100):
        try:
            start_val = sr1(IP(dst=zombie)/TCP(flags="SA",dport=port),timeout=1,verbose=0) 
            send(IP(src=zombie,dst=target)/TCP(flags="S",dport=port),verbose=0)
            end_val = sr1(IP(dst=zombie)/TCP(flags="SA",dport=port),timeout=1,verbose=0)
            if end_val[IP].id == (start_val[IP].id + 2):
                print port
        except:
            pass
print "--------------Zombie Scan Suite------------------\n"   //程序执行组件/入口
print "1 -  Identify Zombie Host\n"
print "2 -  Perform Zombie Scan\n"
ans = raw_input("Select an Option (1 or 2):")
if ans == "1":
    zombie = raw_input("Enter IP address to test IPID sequence:")
    ipid(zombie)
else:
    if ans == "2":
        zombie = raw_input("Enter IP address for zombie system:")
        target = raw_input("Enter IP address for scan target:")
        zombiescan(target,zombie)
结果显示
  • 2.2.4 nmap实现僵尸扫描

(1)发现僵尸机

namp -p445 192.168.50.185 --script=ipidseq.nse
判断是否为zombie

(2)扫描目标

nmap 192.168.50.183 -sI 192.168.50.185 -Pn -p 0-100
利用zombie扫描目标主机
  • 2.3全连接端口扫描

  • 2.3.1 scapy:
    ①syn扫描不需要raw packets
    ②内核认为syn/ack是非法包,直接发送rst终端连接
    ③全连接扫描对scapy比较困难 //需要iptables屏蔽reset

  • 脚本1:

#!/usr/bin/python

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

reponse=sr1(IP(dst="192.168.50.183")/TCP(dport=80,flags="S"))
reply=sr1(IP(dst="192.168.50.183")/TCP(dport=80,flags="A",ack=(reponse[TCP].seq+1)))   //发送一个ack确认包,并且seq以返回的+1

通过抓包发现,在对方返回syn+ack时,系统会给对方发送rst,此时在给对方发送ack确认包,对方会认为这不是连接,会返回一个rst


全连接扫描抓包
  • 脚本2:
    将上述的脚本完善一下,同时由于系统会自动返回reset,因此将其系统的reset屏蔽掉,再看结果 :
#!/usr/bin/python

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

SYN=IP(dst="192.168.50.183")/TCP(dport=21,flags="S")
SYN.display()

print "\n\n-- RECEIVED --"
response=sr1(SYN,timeout=1,verbose=0)
response.display()

if int(response[TCP].flags) ==18:
    print "\n\n -- SENT --"
    A=IP(dst="192.168.50.183")/TCP(dport=21,flags="A",ack=(response[TCP].seq+1))
    A.display()
    print "\n\n-- RECEIVED --"
    response2=sr1(A,timeout=1,verbose=0)
    response2.display()
else:
    print "SYN.ACK not returned"

** 设置iptables,将宿主机的rst包在output方向上drop**

# iptables -A OUTPUT -p tcp --tcp-flags RST RST -d 192.168.50.183 -j DROP 
iptables生效

此时在抓包查看:

宿主机返回ACK
  • 2.3.2 nmap
nmap -sT 192.168.50.183 -p1-500
  • 2.3.3 dmitry
dmitry  -p 192.168.50.183 
dmitry
  • 2.3.4 NC
# nc -nv -w 1 -z 192.168.50.183 1-500  //-w表示扫描一个端口的等待时间为1s,-z表示使用扫描
Paste_Image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,271评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,725评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,252评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,634评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,549评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,985评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,471评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,128评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,257评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,233评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,235评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,940评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,528评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,623评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,858评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,245评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,790评论 2 339

推荐阅读更多精彩内容