端口扫描

本贴最后更新于 2007 天前,其中的信息可能已经时移世易

端口扫描


• 端口对应网络服务及应用端程序

• 服务端程序的漏洞通过端口攻入

•发现开放的端口

• 更具体的攻击面

UDP 端口扫描

• 假设 ICMP port-unreachable 响应,代表端口关闭

• 目标系统不响应 ICMP port-unreachable 时,可能产生误判

• 完整的 UDP 应用层请求

• 准确性高

• 耗时巨大

Scapy UDP Scan

• 端口关闭:ICMP port-unreachable

• 端口开放:没有回包

• 了解每一种基于 UDP 的应用层包结构很有帮助

• 与三层相同的技术

• 误判

• Scapy

• sr1(IP(dst="1.1.1.1")/UDP(dport=53),timeout=1,verbose=1)

./udp_scan.py 1.1.1.1 1 100

#!/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"Usage - ./udp_scan.py [Target-IP] [FIRSR PORT] [LAST PORT]"

print"Example - ./udp_scan.py 192.168.1.1 1 254"

print"Example will UDP port scan ports 1 through 254 on 192.168.1.1"

  

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

Nmap

• nmap -sU 1.1.1.1 默认扫描常用的 1000 个端口 (s:scanner U:UDP)

• 默认的 1000 个参数

• ICMP host-unreachable

• nmap 1.1.1.1 -sU -p 53 (p:port)

• nmap -iL iplist.txt -sU -p 1-200

TCP 端口扫描

    • 基于连接的协议

    • 三次握手

    • 隐蔽扫描(只发 syn 包,目标端口开放回 ack,否则回 rst )

    • 僵尸扫描

    • 全连接扫描(建立完整的三次握手)

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


①• --->(syn)•

②•<---(syn,ack)•

③• --->(ack)•

端口扫描

• 隐蔽扫描——syn

    • 不建立完整链接

    • 应用层日志不记录扫描行为——隐蔽

• 僵尸扫描

    • 极其隐蔽

    • 实施条件苛刻(发起者可以伪造 IP 地址的网络环境)

    • 可伪造源地址

    • 可选择僵尸机

        • 闲置系统(基本不与服务器通信)

        • 系统使用递增的 IPID (ip 包头中的 id 字段:Identification,不同操作系统 id 产生不同,若为递增,每发一个 ip 包,id 加一)

            • 0(×)

            • 随机(×)

①scanner 向 zombie 发送一个 ack/syn,zombie 回复 RST,ip 包中 id 字段=x;

②scanner 伪造源 ip 为 zombie 的 ip,向 target 发送 syn 包,target 向 zombie 回复 syn/ack,zombie 回复 target RST,ip 包中 id 字段=x+1;(端口没开放则 target 回复 zombie RST,zombie 不做回复)

③scanner 向 zombie 发送 syn/ack,zombie 回复 RST,若 ip 包中 id 字段=x+2;说明 target 的目标端口开(id=x+1 则说明端口关闭)

隐蔽端口扫描

• syn——syn/ack——rst (给目标机器发送 syn,目标返回 syn/ack,再给目标机器返回 rst,断开三次握手)

• scapy

    • sr1(IP(dst="192.168.1.1")/TCP(dport=80),timeout=1,verbose=1)

    • ./syn_scan.py





• nmap -sS 192.168.1.1 -p 80,21,25,110,443 (s:scanner S:SYN;默认syn扫描)

• nmap -sS 192.168.1.1 -p 1-65536 --open (只显示open)

• nmap -sS 192.168.1.1 -p- --open (-p-等于-p 65535)

• nmap -sS -iL iplist.txt -p 80,21,22,23

隐蔽端口扫描

• hping3

• hping3 192.168.1.1 --scan 80 -S (S:SYN)

• hping3 192.168.1.1 --scan 80,21,25,443 -S

• hping3 192.168.1.1 --scan 0-65535 -S

• hping3 -c 10 -S --spoof 192.168.1.138 -p ++1 192.168.1.1 (spoof:欺骗,即伪造源ip;++1:从端口1开始,每次加1)

全连接端口扫描

• Scapy

    • SYN 不需要 raw packets

    • ٖ 内核认为 syn/ack 是非法包,直接返回 rst 终端连接

    • 全连接扫描对 scapy 比较困难

    • sr1(IP(dst="192.168.20.2")/TCP(dport=22,flags='S'))

    • ./tcp_scan1.py

    • ./tcp_scan2.py

    • iptables -A OUTPUT -p tcp --tcp-flags RST RST -d 192.168.1.1 -j DROP (A:添加规则,p:协议,d:目标地址,j:动作)

tcp_scan1.py


#!/usr/bin/python

import logging

logging.getLogger("scapy.runtime").setLevel(logging.ERROR)

from scapy.all import*

  

response=sr1(IP(dst="192.168.1.1")/TCP(dport=80,flags='S'))

reply=sr1(IP(dst="102.158.1.1")/TCP(dport=80,flags='A',ack=(response[TCP].seq+1)))

tcp_scan2.py


import logging

logging.getLogger("scapy.runtime").setLevel(logging.ERROR)

from scapy.all import*

  

SYN=IP(dst="192.168.1.1")/TCP(dport=1234,flags='S')

  

print "--SENT--"

SYN.display()

  

print "\n\n-- RECEIVED --"

response=sr1(SYN,timeout=1,verbose=0)

response.display()

## 收到SYN-ACK后,此时操作系统内核会自动回复RST,中断连接

if int(response[TCP].flags)==18:

print "\n\n -- SENT --"

A=IP(dst="192.168.1.1")/TCP(dport=1234,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"

全连接端口扫描

• nmap -sT 1.1.1.1 -p 80 (sT:TCP全连接端口扫描)

• nmap -sT 1.1.1.1 -p 80,21,25

• nmap -sT 1.1.1.1 -p 80-2000

• nmap -sT -iL iplist.txt -p 80

• 默认1000个常用端口

全连接端口扫描

• dmitry

    • 功能简单,但使用简便

    • 默认 150 个常用端口


• dmitry -p 172.16.36.135

• dmitry -p 172.16.36.135 -o output (o:save output to file)

全连接端口扫描

• nc -nv -w 1 -z 192.168.60.4 1-100 (w:超时时间,v:verbose详细信息,n:不做域名解析)

• for x in $(seq 20 30); do nc -nv -w 1 -z 1.1.1.1 $x; done | grep open

• for x in $(seq 1 254); do nc -nv -w 1 -z 1.1.1.$x 80; done

  • Kali
    12 引用 • 5 回帖 • 1 关注

相关帖子

回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...