网络安全 -- 扫描

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子域挖掘机

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Lp49Rj6B-1662114158128)(file://F:\笔记图片\2022-09-01-15-59-06-image.png?msec=1662113046113)]

dnsenum工具
# -f指定字典
dnsenum -f /usr/share/dnsenum/dns.txt woniuxy.com
在线网站

http://z.zcjun.com/

后台扫描

御剑

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Quttu6uW-1662114158129)(file://F:\笔记图片\2022-09-01-16-13-45-image.png?msec=1662113046092)]

# 大致的原理
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

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2XvoUb80-1662114158129)(file:///F:/笔记图片/2022-09-01-17-49-27-image.png?msec=1662113046192)]
  • 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

    • 搜索一切可以联网的硬件设备,如摄像头、路由器、打印机等
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值