黄玮
语出《孙子·谋攻》
知己知彼,百战不殆;不知彼而知己,一胜一负;不知彼,不知己,每战必殆。
Wireshark 工具菜单里 Statistics –> Flow Graph
/etc/services
/usr/share/nmap/nmap-services
(安装 nmap
之后)ℹ️ 注意事项
端口状态是传输层的概念,不要和网络层、数据链路层、物理层可达混淆
#! /usr/bin/env python
# arping: arpings a network
import sys
from scapy.all import srp, Ether, ARP, conf
if len(sys.argv) != 2:
print("Usage: arping <net>\n eg: arping 192.168.56.1/24")
sys.exit(1)
conf.verb = 0
pkt = Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=sys.argv[1])
ans, unans = srp(pkt, timeout=2)
for snd, rcv in ans:
print("{} {}".format(rcv.src, rcv.psrc))
#!/usr/bin/env python
import sys
import threading
import ipaddress
from scapy.all import ICMP, IP, sr1
from queue import Queue
if len(sys.argv) < 2:
print("Usage: icmping <host> [icmp_type] [icmp_code]\n")
print("eg: icmping 192.168.56.0/24")
print("eg: icmping 192.168.56.0/24 13 0")
print("eg: icmping 192.168.56.0/24 15 0")
print("eg: icmping 192.168.56.0/24 17 0")
sys.exit(1)
network = sys.argv[1]
if len(sys.argv) < 3:
icmp_type = 8
else:
icmp_type = int(sys.argv[2])
if len(sys.argv) < 4:
icmp_code = 0
else:
icmp_code = int(sys.argv[3])
max_threads = 100
ip_net = ipaddress.ip_network(network)
all_hosts = list(ip_net.hosts())
live_count = 0
print('Sweeping Network with ICMP: {} type={}/code={}'.format(network, icmp_type, icmp_code))
def pingsweep(ip):
host = str(all_hosts[ip])
resp = sr1(
IP(dst=str(host))/ICMP(type=icmp_type, code=icmp_code),
timeout=2,
verbose=0,
)
if resp is None:
# print(f"{host} is down or not responding.")
return 0
elif (
int(resp.getlayer(ICMP).type) == 3 and int(resp.getlayer(ICMP).code) in [1, 2, 3, 9, 10, 13]
):
# print(f"{host} is blocking ICMP.")
return 0
else:
print(f"{host} is responding.")
return 1
def threader():
while True:
worker = q.get()
pingsweep(worker)
q.task_done()
q = Queue()
for x in range(max_threads):
t = threading.Thread(target=threader)
t.daemon = True
t.start()
for worker in range(len(all_hosts)):
q.put(worker)
q.join()
ping -b 192.168.0.255
一些其它 ICMP 类型包也可以用于对主机或网络设备的探测,如:
防火墙和网络过滤设备的存在,常常导致传统的探测手段变得无效,为了突破这种限制
ICMP Parameter Problem Error
信息
Header Length Field
和 IP Options Field
ICMP Destination Unreachable
信息ICMP Fragment Reassembly Time Exceeded
错误报文PMTU
且设置禁止分片标志, 该路由器会反馈 Fragmentation Needed and Don’t Fragment Bit was Set
差错报文,从而获取目标系统的网络拓扑结构序号 | 通信方向 | 流程 1 | 流程 2 | 流程 3 |
---|---|---|---|---|
1 | C -> S | SYN+Port(n) | SYN+Port(n) | SYN+Port(n) |
2 | S -> C | SYN/ACK | RST | 无响应/其他拒绝反馈报文 |
3 | C -> S | ACK | ||
4 | C -> S | RST | ||
状态推断 | 开放 ✅ | 关闭 ⛔ | 被过滤 ⚠️ |
序号 | 通信方向 | 流程 1 | 流程 2 |
---|---|---|---|
1 | C -> S | UDP+Port(n) | UDP+Port(n) |
2 | S -> C | UDP+port(n) 响应数据 | 无响应/其他拒绝反馈报文 |
状态推断 | 开放 ✅ | 开放 ✅ / 关闭 ⛔ / 被过滤 ⚠️ |
序号 | 通信方向 | 流程 1 | 流程 2 | 流程 3 |
---|---|---|---|---|
1 | C -> S | SYN+Port(n) | SYN+Port(n) | SYN+Port(n) |
2 | S -> C | SYN/ACK | RST | 无响应/其他拒绝反馈报文 |
3 | C -> S | RST | ||
状态推断 | 开放 ✅ | 关闭 ⛔ | 被过滤 ⚠️ |
跳板机 IP
)发起 SYN 扫描序号 | 通信方向 | 流程 1 | 流程 2 |
---|---|---|---|
1 | C -> S | TCP FIN+Port(n) | TCP FIN+Port(n) |
2 | S -> C | RST | 无响应/其他拒绝反馈报文 |
状态推断 | 关闭 ⛔ | 开放 ✅ / 关闭 ⛔ / 被过滤 ⚠️ |
序号 | 通信方向 | 流程 1 | 流程 2 |
---|---|---|---|
1 | C -> S | TCP FIN(1),PUSH(1),URG(1)+Port(n) | TCP FIN(1),PUSH(1),URG(1)+Port(n) |
2 | S -> C | RST | 无响应/其他拒绝反馈报文 |
状态推断 | 关闭 ⛔ | 开放 ✅ / 关闭 ⛔ / 被过滤 ⚠️ |
序号 | 通信方向 | 流程 1 | 流程 2 |
---|---|---|---|
1 | C -> S | TCP FIN(0),PUSH(0),URG(0)+Port(n) | TCP FIN(0),PUSH(0),URG(0)+Port(n) |
2 | S -> C | RST | 无响应/其他拒绝反馈报文 |
状态推断 | 关闭 ⛔ | 开放 ✅ / 关闭 ⛔ / 被过滤 ⚠️ |
序号 | 通信方向 | 流程 1 | 流程 2 |
---|---|---|---|
1 | C -> S | ACK+Port(n) | ACK+Port(n) |
2 | S -> C | RST / 其他拒绝反馈报文 | 无响应 |
状态推断 | 被过滤 ⚠️ | 关闭 ⛔ |
Don't Fragment
位非本课程关注重点
dpkg -L nmap
dpkg -L nmap-common
/usr/share/nmap
文件 | 作用说明 |
---|---|
nmap-mac-prefixes | MAC地址对应厂家知识库 |
nmap-os-db | 操作系统指纹知识库 |
nmap-protocols | 协议类型字段标识知识库 |
nmap-rpc | RPC应用类型指纹知识库 |
nmap-service-probes | 应用程序交互行为指纹知识库 |
nmap-services | 端口与应用/服务映射关系知识库 |
nmap –help
man nmap
nmap cheatsheet