kali渗透
- 1:端口扫描
- 2:UDP 扫描
- 2.1:Scapy
- 2.2:nmap
- 3:半开放扫描
- 3.1:Scapy
- 3.2:nmap
- 3.3:hping3
- 4:全连接扫描
- 4.1:Scapy
- 4.2:nmap
- 4.3:dmitry
- 4.4:NetCat
- 5:僵尸扫描
- 5.1:Scapy
- 5.2:nmap
本文以 kali-linux-2022.3-vmware-amd64 为例。
一些命令与工具只做简单介绍。其使用另见《安全工具录》。
1:端口扫描
意义:
- 端口对应网络服务及应用程序。
- 服务端程序漏洞通过端口攻入。
- 发现开放的端口,就有更具体的攻击面。
原理:
UDP 端口扫描:
- UDP 是一个无连接的协议,因此 UDP 扫描需要发送探测报文并等待响应。
假设 ICMP port-unreachable 响应代表端口关闭(可能误判) - 完整的 UPD 应用层请求:准确性高、耗时巨大。
TCP 端口扫描:
-
全连接扫描(TCP Connect Scan)
扫描器尝试与目标主机的端口建立完整的TCP连接。如果连接成功建立,则说明该端口是开放的。 -
半开放扫描(SYN 扫描,隐蔽扫描,TCP SYN Scan)
扫描器发送一个 TCP SYN 包(同步包)到目标主机的指定端口,如果收到目标主机的 TCP SYN/ACK 包(同步/应答包),则表示该端口是开放的;如果收到目标主机的 RST 包(复位包)或没有收到任何响应,则表示该端口是关闭的。 -
僵尸扫描(Zombie Scanning)
所有的 TCP 扫描方式都是基于三次握手的变化来判断目标端口状态。
2:UDP 扫描
发送 UDP 数据包。
- 如果目标主机返回一个 ICMP 端口不可达的响应,表示该端口关闭或有防火墙。
2.1:Scapy
命令行输入 scapy
进入或作为 python 模块使用。
示例01:UDP 扫描:UDP_scan.py
#!/usr/bin/python
import logging
import time
import sys
from scapy.all import *
from scapy.layers.inet import IP, UDP
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
if len(sys.argv) != 4:
print("Usage: ./UDP_scan.py <Target-IP> <First Port> <Last Port>")
print("Example: ./UDP_scan.py 172.16.36.0 1 100")
sys.exit()
ip = str(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=1, verbose=0)
time.sleep(1)
if a == None:
print(port)
else:
pass
print("END")
sys.exit()
2.2:nmap
基本语法:
nmap 选项
部分选项:
参数 | 说明 |
---|---|
-sU | UDP Scan. |
-p <port ranges> | Only scan specified ports. |
如果不指定端口,默认扫描内置的 1000 个常用端口。
示例01:
nmap -sU 1.1.1.1
示例02:
nmap 1.1.1.1 -sU -p 53
示例03:
nmap -iL iplist.txt -sU -p 1-200
3:半开放扫描
半开放扫描(SYN 扫描,隐蔽扫描,TCP SYN Scan)
扫描器向目标主机发送一个 SYN 数据包
- 如果目标主机返回一个 SYN/ACK 数据包(同步/应答),表示端口是开放的,即目标主机正在监听该端口,并愿意接收连接。
- 如果目标主机返回一个 RST(复位)数据包,表示端口是关闭的,即目标主机并未监听该端口,或者有防火墙等机制阻止了扫描器的访问。
不建立完整连接,应用日志不记录扫描行为:比较隐蔽。
3.1:Scapy
命令行输入 scapy
进入或作为 python 模块使用。
示例01:syn_scan.py。
#!/usr/bin/python
import logging
import sys
from scapy.all import *
from scapy.layers.inet import IP, TCP
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
if len(sys.argv) != 4:
print("Usage: ./syn_scan.py <Target-IP> <First Port> <Last Port>")
print("Example: ./syn_scan.py 172.16.36.0 1 100")
sys.exit()
ip = str(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
elif int(a[TCP].flags) == 18:
print(port)
else:
pass
print("END")
sys.exit()
3.2:nmap
基本语法:
nmap 选项
部分选项:
参数 | 说明 |
---|---|
-sS/sT/sA/sW/sM | TCP SYN/Connect()/ACK/Window/Maimon scans. |
--open | Only show open (or possibly open) ports. |
示例01:
nmap -sS 1.1.1.1 -p 80,21,25,110,443
示例02:
nmap -sS 1.1.1.1 -p 1-65535 --open
示例03:与 示例02 一样。
nmap -sS 1.1.1.1 -p- --open
3.3:hping3
基本语法:
hping3 选项
部分选项:
参数 | 说明 |
---|---|
-8 或 --scan | SCAN mode. |
-S 或 --syn | set SYN flag. |
-p 或 --destport | [+][+]port destination port(default 0) ctrl+z inc/dec. |
-a 或 --spoof | spoof source address. |
示例01:
hping3 1.1.1.1 --scan 80,21,25,443 -S
示例02:
hping3 1.1.1.1 --scan 0-65535 -S
示例03:发送10个 TCP SYN 数据包,源 IP 地址为 1.1.1.2,目标 IP 地址为 1.1.1.3,并向 1 号端口开始递增发送数据包。
hping3 -c 10 -S --spoof 1.1.1.2 -p ++1 1.1.1.3
4:全连接扫描
- 扫描器向目标主机发送一个 SYN 数据包,如果目标主机返回一个 SYN/ACK 数据包(同步/应答),表示端口开放。
- 然后扫描器发送一个 ACK 数据包(应答),完成三次握手过程,建立一个完全的TCP连接。
- 建立连接后,扫描器可以选择终止连接或者发送其他命令进行进一步的探测。
4.1:Scapy
Scapy 实现全连接扫描比较困难,需要配合防火墙。
因为内核认为莫名收到的 SYN/ACK 数据包是非法包,直接发送 RST 数据包终止连接。
4.2:nmap
基本语法:
nmap 选项
部分选项:
参数 | 说明 |
---|---|
-sS/sT/sA/sW/sM | TCP SYN/Connect()/ACK/Window/Maimon scans. |
示例01:
nmap -sT 1.1.1.1 -p 80,21,25
示例02:
nmap -sT 1.1.1.1 -p 80-2000
4.3:dmitry
Dmitry 用于网络侦察:端口扫描、服务识别等。功能简单,但使用简便。
Deepmagic Information Gathering Tool.
“There be some deep magic going on”.
基本语法:
dmitry 选项
部分选项:
参数 | 说明 |
---|---|
-p | Perform a TCP port scan on a host. |
-o | Save output to %host.txt or to file specified by -o file |
示例01:
dmitry -p 172.16.36.135 -o output.txt
4.4:NetCat
基本语法:
nc 选项
部分选项:
参数 | 说明 |
---|---|
-n | numeric-only IP addresses, no DNS. |
-v | verbose [use twice to be more verbose]. |
-w secs | timeout for connects and final net reads. |
-z | zero-I/O mode [used for scanning]. |
示例01:
nc -nv -w 1 -z 192.168.60.4 1-100
-z
:表示进行端口扫描。对指定的主机和端口范围执行零输入和零输出的扫描,以确定它们是否处于打开状态。
示例02:简单脚本,对某主机端口扫描。
for x in $(seq 20 30); do nc -nv -w 1 -z 1.1.1.1 $x; done | grep open
示例03:简单脚本,对某网段主机 80 端口扫描。
for x in $(seq 1 254); do nc -nv -w 1 -z 1.1.1.$x 80; done
5:僵尸扫描
僵尸扫描:
- 极度隐蔽
- 可伪造源地址
- 实施条件苛刻
这里的僵尸机不是指被控制的主机,而是网络中足够闲置的主机系统。
僵尸机要满足两个条件:
- 足够闲置。
- 系统使用递增的 IPID。
IPID(IP 标识符)是网络层协议(如IPv4)中用于标识每个数据包的唯一值。
原理如下图:
5.1:Scapy
示例01:zombie_scan.py
#!/usr/bin/python
import logging
from scapy.all import *
from scapy.layers.inet import IP, TCP
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
def zombie_scan(target, zombie):
print("\nScanning target" + target + " with zombie " + zombie)
print("\n-------------Open Ports 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"), timeout=1, verbose=0)
if end_val[IP].id == (start_val[IP].id + 2):
print(port)
except:
pass
def ipid(zombie):
reply_1 = sr1(IP(dst=zombie)/TCP(flags="SA"), timeout=1, verbose=0)
send(IP(dst=zombie)/TCP(flags="SA"), verbose=0)
reply_2 = sr1(IP(dst=zombie)/TCP(flags="SA"), timeout=1, verbose=0)
if reply_2[IP].id == (reply_1[IP].id + 2):
print("IPID sequence is incremental and target appears to be idle. ZOMBIE LOCATED")
response = input("Do you want to use this zombie to perform a scan? (y or n): ")
if response == "y":
target = input("Enter the IP address of the target system: ")
zombie_scan(target, zombie)
else:
print("Either the IPID sequence is not incremental or the target is not idle. NOT A GOOD ZOMBIE")
print("-------------Zombie Scan Suite-------------\n")
print("1 - Identify Zombie Host")
print("2 - Perform Zombie Scan\n")
ans = input("Select an Option (1 or 2): ")
if ans == "1":
zombie = input("Enter IP address to test IPID sequence: ")
ipid(zombie)
elif ans == "2":
zombie = input("Enter IP address for zombie system: ")
target = input("Enter IP address for scan target: ")
zombie_scan(target, zombie)
5.2:nmap
基本语法:
nmap 选项
部分选项:
参数 | 说明 |
---|---|
--script=<Lua scripts> | “Lua scripts” is a comma separated list of directories, script-files or script-categories. |
-sI <zombie host[:probeport]> | Idle scan.(欺骗扫描) |
-Pn | Treat all hosts as online – skip host discovery.(禁用主机发现,跳过对目标主机是否在线的检测。) |
可以到 /usr/share/nmap/scripts/ 目录下查看所有 nmap 脚本。
示例01:
发现僵尸:
nmap -p445 172.168.2.133 --script=ipidseq.nse
ipidseq.nse 是 Nmap 的一个脚本,用于检测目标主机的 IPID 序列。
扫描目标:
nmap 172.16.36.135 -sI 172.168.2.133 -Pn -p 0-100
量大祸不在,机深祸亦深。
——《增广贤文》