python实现渗透测试的简单介绍

hacker|
144

打造自己的渗透测试框架—溯光

TrackRay简介

溯光,英文名“TrackRay”,意为逆光而行,追溯光源。同时致敬安全圈前辈开发的“溯雪”,“流光”。

溯光是一个开源的插件化渗透测试框架,框架自身实现了漏洞扫描功能,集成了知名安全工具:Metasploit、Nmap、Sqlmap、AWVS等。

溯光使用 Java 编写,SpringBoot 作为基础框架,JPA + HSQLDB嵌入式数据库做持久化,Maven 管理依赖,Jython 实现 Python 插件调用,quartz 做任务调度,freemarker + thymeleaf 做视图层,Websocket 实现命令行式插件交互。

框架可扩展性高,支持 Java、Python、JSON 等方式编写插件,有“漏洞扫描插件”、“爬虫插件”、“MVC插件”、“内部插件”、“无交互插件”和“可交互插件” 等插件类型。

功能展示

主页

登录

任务创建

任务列表

任务详情

无交互接口插件调用

MVC插件示例

交互式插件控制台

MSF 控制台

依赖环境

JDK 1.8

Python 2.7

Maven

Git

Metasploit

Nmap(建议安装)

SQLMAP(建议安装)

AWVS

**加粗为必须环境,没有安装程序则无法正常编译运行

不论是 Windows 还是 linux 一定需要先安装 JDK1.8 和 Maven。安装过程这里不做演示。保证 JDK 和 Maven 都在系统环境变量,能执行java -version 和 mvn --version即可。

安装过程

第一步

手动启动 AWVS 服务

登录后台,生成一个API密匙。

复制密匙和 AWVS 的地址。

找到web/src/main/resources/application.properties配置文件。

修改如下部分

第二步

找到你 python 的第三方库目录。

Windows 的一般在 python 安装目录下的/Lib/site-packages

Linux 下可以通过输出 sys.path 来找第三方包路径

我的是 D:/Python2/Lib/site-packages

同样找到web/src/main/resources/application.properties配置文件。

修改python.package.path参数

第三步

安装 Maven 后找到仓库位置。

如果没有在 settings.xml 里配置指定仓库目录,默认会在当前用户目录中生成一个 .m2的目录

找到仓库目录后修改 application.properties 的 maven.repository.path参数

第四步

这个是 DNSLOG 回显检测漏洞时需要的。

去 ceye.io 注册一个账号,拿到给你分配的域名和 TOKEN。

修改配置文件

第五步

启动 msf 和 sqlmapapi。

如果你是 kali 操作系统,可以直接运行startdep.sh。

如果是其他系统,则要找到 metasploit 和 sqlmap 的目录分别执行

启动成功后修改配置文件

第六步

编译打包程序

等待依赖下载完成和编译完成,如果以上操作都没有出现问题则会提示 BUILD SUCCESS

编译成功后会在当前目录打包一个trackray.jar就是溯光的主程序。

然后直接执行startup.bat或startup.sh溯光就会启动服务。

没有抛出异常或ERROR日志,访问 8080 端口正常。

服务启动正常后,登录 iZone 社区账号。

**开发插件建议使用 Intellij IDEA IDE,需要安装 lombok 插件。

目录结构

插件

AbstractPlugin

这是交互式插件和非交互式插件的父类。

BASE常量

其中的静态常量 BASE 是 /resources/include/ 的所在目录。

如果你的插件需要额外的静态资源,那么你可以在 /resources/include 目录里创建一个和插件 KEY 相同的文件夹,便于识别,如果没有在 @Plugin 注解中设置 value 则默认的插件 KEY 就是当前类名首字母小写。

如 Typecho001 = typecho001

check(Map param)

这是用于检验是否合规的方法,需要被强制重写,当返回 true 时才会调用 start() 方法

param 参数是从前台传过来的参数键值对。

常被用于检验参数格式是否正确或漏洞是否存在。

after()

在 start() 方法之前调用

before()

在 start() 方法之后调用

start()

这是一个抽象方法,所有继承了该类的子类都需要重写这个方法。

在 check 方法 通过后会调用 start() 方法

start() 方法返回值最终会会当做插件结果,响应给前台。

shell()

调用当前系统 shell 来辅助完成插件功能。

executor()

插件执行的主方法

crawlerPage

http请求对象(不推荐使用)

fetcher

执行 http 请求对象(不推荐使用)

errorMsg

当校验不通过时,返回给前台的信息。

param

前台传过来的参数键值对

requests

HTTP 发包工具(推荐使用)

hackKit

hack 常用工具包

无交互插件

无交互插件需要你填写好所有要填写的参数,直接请求接口来执行插件。

默认需要去继承 CommonPlugin类。

这是一个抽象类,继承了 AbstractPlugin

主要多出来两个属性:request 和 response。

继承了 CommonPlugin 的类可以通过调用这两个属性来控制请求和响应内容。

无交互插件同时也需要使用 @Rule 和 @Plugin 插件,这两个注解后面会讲到。

在 ,找到相应的插件填写好参数提交即可完成调用。

或直接调用接口。

交互式插件

交互式插件一般在命令行控制台中调用,可以允许你通过命令行交互来完成插件的调用。

交互式插件由 Websocket 实现,想要写一个交互式插件,首先要继承 WebSocketPlugin 类。

同时设置 @Rule 注解的 websocket 参数为 true ,如果需要异步交互需要将 sync 也设置为 true。

内部插件

内部插件是不可以通过外部去调用的,需要继承 InnerPlugin 并使用 @Plugin 注解,通常在漏洞扫描时时会调用。

例如 “网页爬虫”,“指纹识别”,“端口扫描” 等,都是通过调用内部插件实现的。

还有用于检测 SSRF 等漏洞用的 FuckCeye 插件也属于内部插件。

通过 spring 的自动注入,来注入内部插件到当前对象。

例子可参考 WebLogicWLSRCE.java

爬虫插件

爬虫插件会在扫描任务被勾选“网页爬虫”时调用,每爬取一条请求就会调用一次爬虫插件。

爬虫插件需要继承 CrawlerPlugin,继承该类必须重写 check 和 process 方法。

check 方法用于检验请求是否符合插件规则,以免产生多余请求。

当 check 方法 返回为 true 时会调用 process 方法。

process 方法里写插件主要检测代码。

addVulnerable()

当插件检测出漏洞时,可以通过调用 addVulnerable() 方法来向数据库插入一条漏洞。

requests

requests 属性为请求工具包,处理 https 和 http 都很方便。

response

response 属性为当前爬虫得到的 HTTP 响应。

task

task 属性为当前任务对象,如果你的爬虫插件不是检测漏洞而希望是检测一些敏感信息的话可以修改 task.getResult() 里的属性。

参考 FingerProbe.java 或 InfoProbe.java。

target

爬虫爬取到的 URL 对象。

fetcher crawlerPage

http 请求对象(不建议使用)。

漏洞扫描插件

漏洞扫描插件会在,扫描任务中勾选“漏洞攻击模块”时调用。

漏洞扫描插件分为三种

1.独立插件

独立的漏洞扫描插件需要继承 AbstractExploit 并使用 @Plugin 或 @Exploit

AbstractExploit 中有以下需要了解的方法和属性。

requests

http / https 发包工具

target 当前扫描任务的地址。

task

当前扫描任务对象。

check()

check 是一个抽象方法,需要被子类强制重写。

该方法一般用于检验是否符合当前漏洞扫描插件的规则,以免产生多与请求。

attack()

attack 也是一个抽象方法,需要被子类强制重写。

该方法是检测漏洞的主方法。

before()

在 attack 方法前执行

after()

在 attack 方法后执行

addVulnerable()

当插件检测出漏洞时,可以通过调用 addVulnerable() 方法来向数据库插入一条漏洞。

fetcher crawlerPage

http 请求对象(不建议使用)。

2.漏洞规则

位于

实际上这是一个“内部插件”,会在勾选漏洞模块攻击时调用。

有一些漏洞检测方法很简单,只通过简单的判断响应体就能识别出来,也就没有必要再去写一个独立的插件而占用空间了。

在 doSwitch() 方法中会先去根据当前任务的指纹识别结果走一遍 switch 流程。

swtich 的每一个 case 都是 WEB 指纹的枚举对象。

当 switch 找到当前任务 WEB 指纹对应的 case 后,case 内的代码会通过构建一个漏洞规则添加到 loaders 集合里。

如果规则是通用的,可以写在 switch 的外面。

3.kunpeng JSON插件

kunpeng 是一个 go 语言编写的 poc 测试框架,这里我对 kunpeng 的 JSON 插件做了一个支持。

只需要按照 kunpeng json 插件的格式规范创建一个 json 文件到 /resources/json 目录。

在扫描任务勾选“漏洞攻击模块”时会被调用,或通过 MVC 插件调用 。

MVC 插件

位于

MVC 插件的特点在于,他可以像是在写一个功能一样,而非简单的接口式调用。

MVC 插件需要继承 MVCPlugin 类,并使用 @Rule,@Plugin 注解。

MVCPlugin 内置了一个 ModelAndView 对象, 是 SpringMVC 提供的。

可以通过 setViewName() 来指定视图层的网页模板。

通过 addObject(key,value) 向视图层网页模板注入参数。

这里的视图层是使用 thymeleaf 实现的,需要懂 thymeleaf 的语法。

例子可以参考:com.trackray.module.inner.JSONPlugin

继承 MVCPlugin 必须要重写一个 index 方法,这是插件的入口。

如果需要写其他的功能,就得再创建一个 public 返回值为 void 的无参方法。

并且要在该方法上使用 @Function 注解,该注解的 value 参数如果不填写的话则默认的 requestMapping 地址为方法名。

例如

最后还需要在 /module/src/main/resources/templates 创建一个目录名为插件 KEY 的目录。

里面存放扩展名为 .html 的模板文件。

Python 插件

python 插件有两种实现方式。

1.通过命令行实现

这种方式最为简单,通过在 include 里写一个 python 脚本。

然后在插件里调用 shell() 方法来执行系统命令。

案例可参考 com.trackray.module.plugin.windows.smb.MS17010

但这样还需要再写 java 的代码,对于没有学过 java 的人来说很不友好。

2.通过jython实现

jython 是一个 Python 语言在 Java 中的完全实现。

我将它的调用过程写成了一个交互式插件。

你可以通过在 /resources/python/ 目录下安装如下规范去创建一个 python 文件。

在这个 python 文件中需要写两个方法。

关于注解

@Rule

一般用在“可交互插件”和“无交互插件”类上。

@Plugin

WEB指纹

这里顺便再说一下如何添加指纹库。

指纹库位于 base 模块,是一个枚举类。

可以在首部或尾部添加一条新的枚举,尽量使用 $ 开头。

第一个参数是 指纹的名称,如果第二个参数是 String 类型则是该指纹的说明。

FingerBean 类是指纹匹配对象。

用python搞渗透可以不

可以的

python是一种很方便的脚本语言

写成脚本去进行渗透

Python渗透测试工具都有哪些

网络

Scapy, Scapy3k: 发送,嗅探,分析和伪造网络数据包。可用作交互式包处理程序或单独作为一个库

pypcap, Pcapy, pylibpcap: 几个不同 libpcap 捆绑的python库

libdnet: 低级网络路由,包括端口查看和以太网帧的转发

dpkt: 快速,轻量数据包创建和分析,面向基本的 TCP/IP 协议

Impacket: 伪造和解码网络数据包,支持高级协议如 NMB 和 SMB

pynids: libnids 封装提供网络嗅探,IP 包碎片重组,TCP 流重组和端口扫描侦查

Dirtbags py-pcap: 无需 libpcap 库支持读取 pcap 文件

flowgrep: 通过正则表达式查找数据包中的 Payloads

Knock Subdomain Scan: 通过字典枚举目标子域名

SubBrute: 快速的子域名枚举工具

Mallory: 可扩展的 TCP/UDP 中间人代理工具,可以实时修改非标准协议

Pytbull: 灵活的 IDS/IPS 测试框架(附带超过300个测试样例)

调试和逆向工程

Paimei: 逆向工程框架,包含PyDBG, PIDA , pGRAPH

Immunity Debugger: 脚本 GUI 和命令行调试器

mona.py: Immunity Debugger 中的扩展,用于代替 pvefindaddr

IDAPython: IDA pro 中的插件,集成 Python 编程语言,允许脚本在 IDA Pro 中执行

PyEMU: 全脚本实现的英特尔32位仿真器,用于恶意软件分析

pefile: 读取并处理 PE 文件

pydasm: Python 封装的libdasm

PyDbgEng: Python 封装的微软 Windows 调试引擎

uhooker: 截获 DLL 或内存中任意地址可执行文件的 API 调用

diStorm: AMD64 下的反汇编库

python-ptrace: Python 写的使用 ptrace 的调试器

vdb/vtrace: vtrace 是用 Python 实现的跨平台调试 API, vdb 是使用它的调试器

Androguard: 安卓应用程序的逆向分析工具

Capstone: 一个轻量级的多平台多架构支持的反汇编框架。支持包括ARM,ARM64,MIPS和x86/x64平台

PyBFD: GNU 二进制文件描述(BFD)库的 Python 接口

Fuzzing

Sulley: 一个模糊器开发和模糊测试的框架,由多个可扩展的构件组成的

Peach Fuzzing Platform: 可扩展的模糊测试框架(v2版本 是用 Python 语言编写的)

antiparser: 模糊测试和故障注入的 API

TAOF: (The Art of Fuzzing, 模糊的艺术)包含 ProxyFuzz, 一个中间人网络模糊测试工具

untidy: 针对 XML 模糊测试工具

Powerfuzzer: 高度自动化和可完全定制的 Web 模糊测试工具

SMUDGE: 纯 Python 实现的网络协议模糊测试

Mistress: 基于预设模式,侦测实时文件格式和侦测畸形数据中的协议

Fuzzbox: 媒体多编码器的模糊测试

Forensic Fuzzing Tools: 通过生成模糊测试用的文件,文件系统和包含模糊测试文件的文件系统,来测试取证工具的鲁棒性

Windows IPC Fuzzing Tools: 使用 Windows 进程间通信机制进行模糊测试的工具

WSBang: 基于 Web 服务自动化测试 SOAP 安全性

Construct: 用于解析和构建数据格式(二进制或文本)的库

fuzzer.py(feliam): 由 Felipe Andres Manzano 编写的简单模糊测试工具

Fusil: 用于编写模糊测试程序的 Python 库

Web

Requests: 优雅,简单,人性化的 HTTP 库

HTTPie: 人性化的类似 cURL 命令行的 HTTP 客户端

ProxMon: 处理代理日志和报告发现的问题

WSMap: 寻找 Web 服务器和发现文件

Twill: 从命令行界面浏览网页。支持自动化网络测试

Ghost.py: Python 写的 WebKit Web 客户端

Windmill: Web 测试工具帮助你轻松实现自动化调试 Web 应用

FunkLoad: Web 功能和负载测试

spynner: Python 写的 Web浏览模块支持 Javascript/AJAX

python-spidermonkey: 是 Mozilla JS 引擎在 Python 上的移植,允许调用 Javascript 脚本和函数

mitmproxy: 支持 SSL 的 HTTP 代理。可以在控制台接口实时检查和编辑网络流量

pathod/pathoc: 变态的 HTTP/S 守护进程,用于测试和折磨 HTTP 客户端

渗透测试之操作系统识别

利用TTL起始值判断操作系统,不同类型的操作系统都有默认的TTL值(简陋扫描,仅作参考)

TTL起始值:Windows xp(及在此版本之前的windows)  128 (广域网中TTL为65-128)

    Linux/Unix64(广域网中TTL为1-64)

    某些Unix:255

    网关:255

使用python脚本进行TTL其实质判断

使用nmap识别操作系统:nmap -O 192.168.45.129 #参数-O表示扫描操作系统信息,nmap基于签名,指纹,特征,CPE编号等方法去判断目标系统的信息

CPE:国际标准化组织,制定了一套标准,将各种设备,操作系统等进行CPE编号,通过编号可以查询到目标系统

使用xprobe2进行操作系统识别,专门用来识别目标操作系统:xprobe2 192.168.45.129,但结果并不是很精确

被动操作系统识别:不主动向目标主机发数据包,基于网络监听原理

通过抓包分析,被动扫描,使用kali中的p0f工具进行网络监听

p0f:p0f是一种被动指纹识别工具,可以识别您连接的机器,连接到您的盒子的机器,甚至连接在盒子附近的机器,即使该设备位于数据包防火墙后面。

p0f的使用:只要接收到数据包就可以根据数据包判断其信息,首先输入p0f,然后在浏览器里面输入目标系统的网址,便会获得目标系统的信息

或者使用p0f结合ARP地址欺骗识别全网OS

snmp扫描:简单网络管理协议,明文传输,使用网络嗅探也可获取到信息

SNMP是英文"Simple Network Management Protocol"的缩写,中文意思是"简单网络管理协议"。SNMP是一种简单网络管理协议,它属于TCP/IP五层协议中的应用层协议,用于网络管理的协议。SNMP主要用于网络设备的管理。由于SNMP协议简单可靠 ,受到了众多厂商的欢迎,成为了目前最为广泛的网管协议。

snmp的基本思想是为不同种类、不同厂家、不同型号的设备定义一个统一的接口和协议,使管理员可以通过统一的外观面对这些需要管理的网管设备进行管理,提高网管管理的效率,简化网络管理员的工作。snmp设计在TCP/IP协议族上,基于TCP/IP协议工作,对网络中支持snmp协议的设备进行管理。

在具体实现上,SNMP为管理员提供了一个网管平台(NMS),又称为管理站,负责网管命令的发出、数据存储、及数据分析。被监管的设备上运行一个SNMP代理(Agent)),代理实现设备与管理站的SNMP通信。如下图

管理站与代理端通过MIB进行接口统一,MIB定义了设备中的被管理对象。管理站和代理都实现了相应的MIB对象,使得双方可以识别对方的数据,实现通信。管理站向代理申请MIB中定义的数据,代理识别后,将管理设备提供的相关状态或参数等数据转换为MIB定义的格式,应答给管理站,完成一次管理操作。

已有的设备,只要新加一个SNMP模块就可以实现网络支持。旧的带扩展槽的设备,只要插入SNMP模块插卡即可支持网络管理。网络上的许多设备,路由器、交换机等,都可以通过添加一个SNMP网管模块而增加网管功能。服务器可以通过运行一个网管进程实现。其他服务级的产品也可以通过网管模块实现网络管理,如Oracle、WebLogic都有SNMP进程,运行后就可以通过管理站对这些系统级服务进行管理。

使用UDP161端口(服务端),162端口(客户端),可以监控网络交换机,防火墙,服务器等设备

可以查看到很多的信息,但经常会被错误配置,snmp里面

有一些默认的Community,分别是Public/private/manager

如果目标的community是public,那么就可以发送SNMP的查询指令,对IP地址进行查询

在kali中存在对snmp扫描的工具,为onesixtyone

在Windows XP系统安装SNMP协议:

1,在运行框输入appwiz.cpl

2,找到管理和监控工具,双击

3,两个都勾选,然后点OK

使用onesixtyone对目标系统进行查询:命令为:onesixtyone 192.168.45.132  public

  onesixtyone -c  字典文件  -I  主机  -o 倒入到的文件 -w 100

onesixtyone默认的字典在:/usr/share/doc/onesixtyone/dict.txt

使用snmpwalk查找目标系统的SNMP信息:snmpwalk 192.168.45.129 -c public -b 2c

snmpcheck -t  192.168.45.129

snmpcheck -t  192.168.45.129 -w  参数-w检测是不是有可写权限

SMB协议扫描:server message block,微软历史上出现安全问题最多的协议,在Windows系统上默认开发,实现文件共享

在Windows系统下管理员的Sid=500,

SMB扫描:nmap -v -p 139,445 192.168.45.132 --open 参数-v表示显示详细信息,参数--open表示显示打开的端口

nmap 192.168.45.132 -p 139,445 --script=smb-os-discovery.nse

smb-os-discovery.nse:这个脚本会基于SMB协议去判别操作系统,主机名,域名,工作组和当前的时间

nmap -v -P 139,445 --script=smb-check-vulns  --script-args=unsafe=1 192.168.45.132

脚本smb-check-vulns:检查已知的SMB重大的漏洞

后面给脚本定义参数 --script-args=unsafe=1,unsafe可能会对系统有伤害,导致宕机,但要比safe准确

nbtscan -r 192.168.45.0/24参数-r使用本地137端口进行扫描,兼容性较好,可以扫描一些老版本的Windows

nbtscan可以扫描同一局域网不同的网段,对于局域网扫描大有裨益

enum4linux -a 192.168.45.132 :

SMTP扫描:目的在于发现目标系统的邮件账号

使用nc -nv 192.168.45.132 25

VRFY root :确定是不是有root用户

nmap扫描SMTP服务:

nmap smtp.163.com -p25 --script=smtp-enum-users.nse --script-args=smtp-enum-

users.methods={VRFY}

脚本smtp-enum-users.nse用于发现远程系统上所有user的账户

nmap smtp.163.com -p25 --script=smtp-open-relay.nse,如果邮件服务器打开了open-relay功能,那么黑客可以拿管理员的邮箱去发送钓鱼邮件

防火墙识别:通过检查回包,可能识别端口是否经过防火墙过滤

设备多种多样,结果存在一定的误差

第一种情况:攻击机向防火墙发送SYN数据包,防火墙没有给攻击机回复,攻击机再发送ACK数据包,若防火墙返回RST数据包,那么证明该端口被防火墙过滤

第二种类似

第三种:攻击机向防火墙发送SYN数据包,防火墙返回SYN+ACK或者SYN+RST数据包,攻击者再发送ACK数据包,若防火墙返回RST数据包,那么就可以证明防火墙对于该端口没被过滤.unfiltered=open

第四种情况类似,证明该端口是关闭的,或者防火墙不允许其他用户访问该端口

使用python脚本去判定:

使用nmap去进行防火墙识别:nmap有系列防火墙过滤检测功能

nmap -sA 192.168.45.129 -p 22 参数-sA表示向目标主机发送ACK数据包,参数-sS表示向目标发送SYN数据包,通过抓包分析收到的数据包判断是否有防火墙检测功能

负载均衡识别:负载均衡可以跟为广域网负载均衡和服务器负载均衡

在kali中使用lbd命令用于识别负载均衡机制

格式:lbd +域名/IP地址,如lbd

WAF识别:WEB应用防火墙,在kali中最常用的waf检测扫描器

输入:wafw00f -l:可以检测出这个工具可以检测到的waf类别

探测微软公司的WAF:wafw00f 

使用nmap中的脚本去扫描目标网站使用的waf信息:nmap    --script=http-waf-detect.nse

脚本详情:

nmap补充:

参数:-iL:把IP地址做成文件,使用该参数扫描这个文件里面的IP! nmap -iL ip.txt

-iR:随机选取目标进行扫描,后面跟需要扫描的主机个数,例:nmap -iR  20  -p 22:随机扫描20个主机的22号端口,默认发送SYN数据包

参数-sn表示不做端口扫描

参数-Pn表示跳过主机发现,扫描所有在线的主机,扫防火墙帮助很大

参数p0表示进行IP协议ping

参数-n/-R表示不进行DNS解析

参数--dns-servers表示指定一个DNS服务器去解析

参数--traceroute表示进行路由追踪

参数-sM表示发送ACK+FIN

参数-sF发送FIN数据包

参数-sV根据特征库匹配开放的服务,加上参数--version-intensity 后面加等级,0最小,9最完善

参数--script=脚本名

参数--script=arge.脚本.脚本名

参数--script-updatedb更新脚本

参数--script-help=脚本名  查看脚本的信息

参数-O检测操作系统类型

参数--scan-delay 表示每次探测间隔多长时间,后面个时间,如nmap 192.168.45.132 --scan-delay 10s :间隔十秒

参数-f表示设置MTU最大传输单元

参数-D表示伪造源地址,增加一些虚假的扫描IP,例:nmap  -D 192.138.1.1,192.151.141.4  172.16.45.1  :扫描172.16.45.1主机,用这两个地址做干扰,防止被发现

参数-S表示伪造源地址,但要获取得到的IP地址,那么就得登陆到伪造的IP上

参数--proxies指定代理服务器

参数--spoof-mac欺骗mac地址 nmap 10.1.1.1  --spoof-mac=00:11:22:33:44:55

参数-6表示扫描IPv6

0条大神的评论

发表评论