IP地址扫描
公网渗透的话不需要IP扫描 已知IP
内网渗透的话必须知道哪些IP地址是存活的 可访问的,然后再进行端口扫描
IP地址工作在IP层 还有ICMP 还有ARP协议中而存在IP信息 可以判断IP地址
使用ping进行IP探测
# ping命令进行IP探测,存在bug 一旦防火墙禁止ICMP 扫描会失败
def ping_ip_c(ip_c, start, step):
import os
for i in range(start, start+step):
ip = ip_c + '.' + str(i)
# 发送一个icmp 超时时间为1000毫秒
output = os.popen(f'ping -n 1 -w 1000 {ip}').read()
if 'TTL=' in output:
print(f"{ip}--存活")
def ping_ip_threading(ip='192.168.10', start=1, end=255, step=10):
import threading
for i in range(start, end, step):
threading.Thread(target=ping_ip_c, args=(ip, i, step)).start()
if __name__ == '__main__':
ping_ip_threading()
基于scapy
from scapy.layers.l2 import ARP
from scapy.sendrecv import sr1
import threading# 配置日志级别 只有报错才会显示
import logging
logging.getLogger('scapy.runtime').setLevel(logging.ERROR)# 如何使用其他方式:使用ARP,防火墙无论如何都不会阻止ARP
def scapy_ip(ip_c,start,step):
for i in range(start, start+step):
if i>=255 :
break
ip = f"{ip_c}.{i}"
try:
pkg = ARP(psrc='192.168.10.20', pdst=ip)
reply = sr1(pkg, timeout=1, verbose=False)
if reply[ARP].hwsrc:
print(f"{ip} -- 存活")
except:
pass
def scapy_ip_thread(ip_c='192.168.10',start=1,end=255,step=10):
for i in range(start,end,step):
threading.Thread(target=scapy_ip,args=(ip_c,i,step)).start()
if __name__ == '__main__':
scapy_ip_thread()
端口扫描
基于socket
import socket,threading,time
# 对目标IP进行扫描,尝试连接目标IP和端口,如果连接成功说明端口开放
# 基于标准的TCP的三次握手 如果连接没有成功的话会进行tcp重发请求 因为设置的超时时间3s左右 解决:设置超时时间 提高扫描效率
# 不管是单线程还是多线程 流量特征都很明显,优化思路:优先扫描常用端口
# 基础一、单线程扫描
def socket_port(ip):
for port in range(120, 65536):
try:
s = socket.socket()
s.settimeout(0.5)
s.connect((ip, port))
print(f"{port}端口可用")
s.close()
except:
print(f"{port}bu")
# 优化一、多线程多任务扫描
def socket_port_thread(ip,start,step):
for port in range(start,start+step):
try:
s = socket.socket()
s.settimeout(0.5)
s.connect((ip,port))
print(f"{port}端口可用")
s.close()
except:
# print(f'{port}不可用')
pass
def start_thread_port(ip,start,end,step):
for i in range(start,end+1,step):
threading.Thread(target=socket_port_thread,args=(ip,i,step)).start()
# 优化二、单线程对常用端口扫描 量少之后可以让每次端口扫描后停止3s 可以防止IDS/IPS进行的阈值检测
# 另外 真实场景下 建议扫描之前 使用 别的公网IP/VPN 进行验证 是否存在入侵防御行为
def socket_normal_port(ip):
normal_ports=[7,21,22,23,25,43,53,67,68,69,79,80,81,88,109,110,113,119,123,135,137,138,139,143,
161,162,179,194,220,389,443,445,465,513,520,546,547,554,563,631,636,991,993,995,
1080,1194,1433,1434,1494,1521,1701,1723,1755,1812,1813,1863,3269,3306,3307,3389,
3544,4369,5060,5061,5355,5432,5671,5672,6379,7001,8080,8081,8088,8443,8883,8888,
9443,9988,15672,50389,50636,61613,61614]
for port in normal_ports:
try:
s = socket.socket()
s.settimeout(0.5) # 设置无法连接情况下的超时时间 提高扫描效率
s.connect((ip,port))
print(f"{port}--可用")
s.close()
except:
pass
time.sleep(3) # 每次端口扫描后停止3s 可以防止IDS/IPS进行的阈值检测
if __name__ == '__main__':
# socket_port('192.168.10.22')
# start_thread_port(ip='117.78.49.99',start=1,end=10000,step=100)
socket_normal_port(ip='117.78.49.99')
基于scapy
# 基于scapy 半连接进行端口扫描
# 目标端口开放:SYN->SYN ACK 未开放:SYN->R ACK
# 在TCP三次握手中的第二次就可以判断出来端口是否存活,socket需要三次握手之后
def scapy_port(ip):
# 通过指定源IP地址,可以实现IP欺骗,进而导致半连接,此类操作也可以用于Flags参数定义上
# pkg = IP(src='192.168.10.20',dst='192.168.10.1')/TCP(dport=80,flags='SA')
for port in range(70, 111):
try:
pkg = IP(src='192.168.10.22', dst=ip) / TCP(dport=port, flags='S')
reply = sr1(pkg, timeout=1, verbose=False)
if reply[TCP].flags == 0x12:
print(f'{port} -- 开放')
except:
pass
Nmap扫描工具
端口状态
-
open 开放的
-
closed 关闭的
-
filtered 被过滤的
- 由于包过滤阻止探测报文到达端口,nmap无法确认端口是否开放
-
unfiltered 未被过滤的
- 意味着端口可访问,但是nmap无法确认是open还是closed
-
open|filtered 开放或者被过滤的
- 无法确认端口是开放或者被过滤的
-
closed|unfiltered 关闭或者未被过滤的
- 无法确认端口是关闭或者未被过滤的
扫描IP
基于的多线程多任务的ARP扫描
nmap -sn 192.168.10.0/24 # 网段
nmap -sn 192.168.10.1-255 # 范围
扫描端口
# TCP三次握手 --- 基于socket 相对于半连接速度比较慢
nmap -sT 192.168.10.22
# Nmap done: 1 IP address (1 host up) scanned in 8.07 seconds
# 半连接SYN --- 基于scapy,发送SYN数据包
nmap -sS 192.168.10.22
# Nmap done: 1 IP address (1 host up) scanned in 4.88 seconds
# 半连接ACK--- 基于scapy,发送ACK数据包
nmap -sA 192.168.10.22
# 不进行ping的端口扫描
nmap -Pn 192.168.10.22
# 扫描端口版本和
nmap -sV 192.168.10.22
# 指定端口扫描
nmap -p 10-100,-p 21,22,25,80,443,445,3306,8080,8888 192.168.10.22
扫描操作系统
nmap -O 192.168.10.22 # 版本信息 名称 开启的端口等等
# nmap怎么知道操作系统的版本的?
'''
nmap内置nmap-os-db 收集了关于几乎所有系统(只要能联网就存在)的指纹,
扫描的时候进行对照
'''
其他常用命令
# 万能开关 扫描所有的信息 端口 版本 操作系统等
namp -A 192.168.10.22
# 快速扫描
nmap -F 192.168.10.22
# ping扫描
nmap -sP 192.168.10.0/24
# 路由跟踪
nmap --traceroute www.woniuxy.com
绕过防火墙
IP欺骗:源IP设置为其他IP nmap -S
MTU分片:将数据包切分多个片段进行发送 nmap -f
MAC欺骗:--spoof-mac 自己也收不到回应
设置延时:为了绕过阈值验证
子域名扫描
前提就是知道主域名 (IP和port)
价值和分类
-
价值:在进行入侵之前,通常会考虑将周边的主机或应用进行排查,进而从周边系统入手入侵。通常情况,主站防御体系更加完善,周边站点可能存在更加薄弱环节
-
分类
-
一级域名:baidu.com
-
二级域名:www.baidu.com、mail.woniuxx.com
-
三级域名:mp.weixin.qq.com
-
通常情况下,子域名的命名是相对比较规范的;而密码因人而异!所以子域名扫描较为简单
确认子域名是否存在
使用ping命令
C:\Users\DELL>ping www.baidu.com
正在 Ping www.a.shifen.com [39.156.66.14] 具有 32 字节的数据:
来自 39.156.66.14 的回复: 字节=32 时间=26ms TTL=52
C:\Users\DELL>ping xxx.yyy
Ping 请求找不到主机 xxx.yyy。请检查该名称,然后重试
如上 域名存在与否ping的结果不同。
注意,Linux和Windows的ping命令参数不太一样,不同平台做不同处理
windows中 指定次数:-n 超时时间:-w
Linux中 指定次数:-c 超时时间:-W
# 没有设置多线程,有bug 报错的很慢
import os
def ping_domain(imp_domain):
with open('G:\\CTF\\字典\\密码字典\\fuzzDicts\\subdomainDicts\\main.txt') as file:
domain_list = file.readlines()
for domain in domain_list[:100]:
result = os.popen(f'ping -n 1 -w 1000 {domain.strip()}.{imp_domain}').read()
if '找不到主机' not in result:
print(f"{domain.strip()}.{imp_domain}")
if __name__ == '__main__':
ping_domain('woniuxy.com')
使用socket库
# 没有设置多线程,有bug 报错的很慢
import socket
def socket_domain():
with open("G:\\CTF\\字典\\密码字典\\fuzzDicts\\subdomainDicts\\main.txt") as file:
domain_list = file.readlines()
for domain in domain_list:
try:
print(domain)
ip = socket.gethostbyname(f'{domain.strip()}.woniuxy.com')
print(f'{domain.strip()}.woniuxy.com---{ip}')
except:
pass
if __name__ == '__main__':
socket_domain()
子域名扫描工具
Layer子域挖掘机
dnsenum工具
# -f指定字典
dnsenum -f /usr/share/dnsenum/dns.txt woniuxy.com
在线网站
http://z.zcjun.com/
后台扫描
御剑
# 大致的原理
import requests
# allow_redirects=False 取消重定向
with open('./pwd.txt')as file:
dirs=file.readlines()
for xx in dirs:
resp = requests.get(f'http://www.woniunote.com/{xx.strip()}',timeout=1,allow_redirects=False)
if "/img/404.png" not in resp.text:
print(f"http://www.woniunote.com/{xx.strip()}")
web站点信息收集
-
已经收集好了IP和port
-
子域名扫描
-
后台扫描
-
kali –
whatweb xxx.xxx
-
whois信息
-
查询某个域名的注册信息
-
在线网站:https://wanwang.aliyun.com/
-
python-whois
-
from whois import whois def whois_info(info): return whois(info) result = whois_info('woniuxy.com') print(result)
-
-
-
nslookup
-
用于确认域名是否使用了CDN网络
-
多行IP很有可能使用了CDN
-
nslookup aliyun.com
-
-
https://fofa.info/
- 可用于端口和服务信息搜集
-
shodan.io
- 搜索一切可以联网的硬件设备,如摄像头、路由器、打印机等