使用python编写一个简单的渗透的脚本


信息收集概要

为什么越厉害的黑客越在意信息收集的过程,因为信息收集的完整性直接决定了渗透测试的结果。信息收集是指黑客为了更加有效地实施渗透攻击而在攻击前或攻击过程中对目标的所有探测活动。

信息收集的作用

1.了解组织安全架构
2.缩小攻击范围
3.描绘网络拓扑
4.建立脆弱点数据库

信息收集分类

(1)主动信息搜集:与目标主机进行直接交互,从而拿到目标信息,缺点是会记录自己的操作信息。
(2)被动信息搜集:不与目标主机进行直接交互,通过搜索引擎或者社会工程等方式间接的获取目标主机的信息。

常用的信息收集方法

在这里插入图片描述

whois信息查询

在这里插入图片描述
当然,kali里也可以使用whois进行查询:
在这里插入图片描述
当然,也不是所有的域名都可以进行whois查询,很多域名也都做了whois查询保护。如下图示:
在这里插入图片描述
当然,常见的在线查询工具还有很多包括,爱站,站长工具,天眼,c段查询等还可以使用超级Ping查询服务器是否使用了CDN。

Nmap介绍

为什么Nmap要单独介绍了,因为Nmap是一个查询服务器端口开放情况的软件,一般经验丰富的渗透大佬,根据端口开放情况就可以快速的判断出网站的服务类型,以及可能存在的漏洞。

主机发现

iR $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 随机选择目标

-iL $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 从文件中加载IP地址

-sL $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 简单的扫描目标

-sn $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ Ping扫描-禁用端口扫描

-Pn $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 将所有主机视为在在线,跳过主机发现

-PS[portlist] $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ (TCP SYN ping) 需要root权限

-PA[portlist] $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ (TCP ACK ping)

-PU[portlist] $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ (UDP ping)

-PY [portlist] $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ (SCTP ping)

-PE/PP/PM $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ ICMP回显,时间戳和网络掩码请求探测

-PO[协议列表] $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ IP协议Ping

-n/-R $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 从不执行DNS解析/始终解析[默认:有时]

–dns-servers $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 指定自定义DNS服务器

–system-dns $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 使用OS的dns服务器

–traceroute $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 跟踪到每个主机的跃点路径

扫描技术

-sS $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 使用TCP的SYN进行扫描

-sT $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 使用TCP进行扫描

-sA $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 使用TCP的ACK进行扫描

-sU $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ UDP扫描

-sI $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ Idle扫描

-sF $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ FIN扫描

-b<FTP中继主机> $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ FTP反弹扫描

端口规格和扫描顺序

-p $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 扫描指定端口

–exclude-ports $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 从扫描中排除指定端口

-f $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 快速模式-扫描比默认扫描更少的端口

-r $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 连续扫描端口-不随机化

–top-ports $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 扫描最常用的端口

服务/版本探测

-sV $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 探测服务/版本信息

–version-intensity $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 设置版本扫描强度(0-9)

–version-all $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 尝试每个强度探测

–version-trace $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 显示详细的版本扫描活动(用于调试)

脚本扫描

-SC $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 等效于 –script=defult

–script = , $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 以逗号分隔的目录,脚本文件或脚本类别

–script-args = <n1=v1, n2=v2> $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 为脚本提供参数

–script-args-file=文件名 $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 从文件名中加载脚本参数

–script-trace $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 显示发送和接受的所有数据

–script-updatedb $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 更新脚本数据库

–script-help= $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 显示有关脚本的帮助

操作系统检测

-o $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 启用os检测

–osscan-limit $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 将os检测限制为可能的目标

–osscan-guess $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 推测操作系统检测结果

时间和性能

–host-timeout $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 设置超时时间

–scan-delay $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 设置探测之间的时间间隔

-T <0-5> $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 设置时间模板,值越小,IDS报警几率越低

防火墙/IDS规避和欺骗

-f $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 报文分段

-s $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 欺骗源地址

-g $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 使用指定的本机端口

–proxies <url,port> $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 使用HTTP/SOCK4代理

-data $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 想发送的数据包中追加自定义的负载

–data-string $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 将自定义的ACSII字符串附加到发送数据包中

–data-length $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 发送数据包时,附加随机数据

–spoof-mac $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ MAC地址欺骗

–badsum $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 发送带有虚假TCP/UNP/STCP校验和的数据包

输出

-oN $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 标准输出

-oX $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ XMl输出

-oS $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ script jlddi3

-oG $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ grepable

-oA $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 同时输出三种主要格式

-v $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 信息详细级别

-d $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 调试级别

–packet-trace $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 跟踪发送和接收的报文

–reason $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 显示端口处于特殊状态的原因

–open $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 仅显示开放的端口

杂项

-6 $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 启动Ipv6扫描

-A $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 启动Os检测,版本检测,脚本扫描和traceroute

-V $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 显示版本号

-h $~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$ 帮助信息

使用案例

在这里插入图片描述

端口扫描脚本

import socket

from datetime import datetime
# 线程池
from multiprocessing.dummy import Pool as ThreadPool

# 目标IP
remote_server_ip = "47.99.142.216"
# 目标ip启用端口
ports = []
# 设置连接超时为0.5s,在校园网中使用时可以适当延长时间
socket.setdefaulttimeout(0.5)


# 端口扫描
def scan_port(port):
    try:
        # 创建套接字
        s = socket.socket()
        # connect()函数的扩展版本,出错时返回出错码,而不是抛出异常
        # connect_ex()和connect()一样都需要传入,ip和port
        # 连接成功时返回 0 ,连接失败时候返回编码,例如:10061
        res = s.connect_ex((remote_server_ip, port))

        if res == 0:  # 如果端口开启 发送 hello 获取banner

            print(f'Port {port}: OPEN')

        s.close()

    except Exception as e:

        print(str(e.message))


if __name__ == '__main__':

    for i in range(1, 65535):
        ports.append(i)

    # 显示扫描时间
    t1 = datetime.now()
    # 设置线程池
    pool = ThreadPool(processes=1000)
    # map() 会根据提供的函数对指定序列做映射。
    results = pool.map(scan_port, ports)

    pool.close()

    print('Multiprocess Scanning Completed in  ', datetime.now() - t1)

敏感文件扫描脚本

import urllib.request
import queue
import threading
import sys


def bytes2human(n):
    """
    >>> bytes2human(10000)
    9K
    >>> bytes2human(100001221)
    95M
    """
    symbols = ('K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y')
    prefix = {}
    for i, s in enumerate(symbols):
        prefix[s] = 1 << (i + 1) * 10

    for s in reversed(symbols):
        if n >= prefix[s]:
            value = int(float(n) / prefix[s])
            return '%s%s' % (value, s)
    return '%sB' % n


def gethtml(url, bak):
    try:
        urlbak = url + bak
        #print(urlbak)
        req = urllib.request.urlopen(urlbak, timeout=10)
        if req.code == 200:
            meta = req.info()
            file_size = int(meta.getheaders("Content-Length")[0])
            m = bytes2human(file_size)
            content_type = meta.getheaders('Content-Type')[0].split(';')[0]
            if file_size == 0:
                return False
            if 'html' in content_type:
                return False
            else:
                print('%s ---- %s ---- %s ' % (urlbak, m, content_type))
                return '%s ---- %s ---- %s ' % (urlbak, m, content_type)
        else:
            return False
    except:
        return False


def writefile(fileName, c):
    f = open(fileName, "a")
    f.write(c + "\n")
    f.close()


q = queue.Queue()


def scanner(url):
    for i in bekadd(url):
        c = gethtml(url, i)
        if c != False:
            writefile("bak.txt", c)


def worker():
    while not q.empty():
        url = q.get()
        scanner(url)
        q.task_done()


def bekadd(url):
    listbak = ['/1.zip', '/1.rar', '/web.rar', '/web.zip', '/www.rar', '/www.zip', '/wwwroot.rar', '/wwwroot.zip',
               '/backup.rar', '/backup.zip', '/database.rar', '/database.zip', '/databak.rar', '/databak.zip',
               '/databackup.rar', '/databackup.zip', '/databack.zip', '/sql.rar', '/sql.zip']
    wwwurl = url[url.find("http://") + 7:].rstrip("/")
    urldomain = url[url.rfind('.', 0, url.rfind('.')) + 1:].rstrip("/")
    urlcenter = urldomain[0:urldomain.rfind('.')].rstrip("/")
    wwwurl = "/" + wwwurl
    urldomain = "/" + urldomain
    urlcenter = "/" + urlcenter
    listbak.append(wwwurl + ".rar")
    listbak.append(wwwurl + ".zip")
    listbak.append(urldomain + ".rar")
    listbak.append(urldomain + ".zip")
    listbak.append(urlcenter + ".rar")
    listbak.append(urlcenter + ".zip")
    return listbak


if __name__ == '__main__':
    if len(sys.argv) < 2:
        # print('mOon:www.moonsec.com')
        print('python scanbak.py url.txt')
        sys.exit()

    lines = open(sys.argv[1], "r")
    for line in lines:
        line = line.rstrip()
        q.put(line)

    for i in range(100):
        t = threading.Thread(target=worker)
        t.start()

文章作者: kento
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 kento !
评论
  目录