网络攻防技术
三月 22, 2022
一、概述
二、信息收集
三、口令攻击
针对口令强度的攻击(弱口令攻击)
- 穷举法(暴破)
- 字典攻击
- 社工
- 组合攻击
- 撞库攻击
- 彩虹表破解:破解哈希算法(主用于MD5、HASH等)
- 原理:基于内存 - 时间衡量方法,通过以一定存储空间换取时间的方式,提高对散列值的破解效率
- windows远程口令猜解
- 基于IPC的远程口令猜解(IPC$文件和打印机共享:139、445)
1
net use \\目标主机IP\ipc$ "口令" /user:"用户名"
- 基于Thrminal Service的远程口令猜解(DRP服务:3389)
- 基于IPC的远程口令猜解(IPC$文件和打印机共享:139、445)
针对口令存储的攻击
- 缓存口令
- 实现原理:在进行用户身份验证时,需要将口令配置加载到内存中,通过对内存读取
- 相关工具:PWDump、Mimikatz
- 口令文件
- 口令通过文件形式进行存放在系统中,对文件进行破解
- 相关实例:
- windows账号和口令存放在SAM文件(C:\Windows\System32\config)
- Linux账号和口令存放在Shadow文件
- 口令的其他存储位置
- (除了缓存和文件)存放其他位置:注册表、(及时口令)casch或内存、硬盘扇区、(主板BIOS存放位置)COMS
- NTLM加密机制:
- 口令转换成Unicode编码
- MD算法对Unicode编码进行散列,得到128比特的散列结果,成为NTLM散列
- CR方式:“挑战/响应”方式(服务器对挑战数据没有时效性要求,可以进行重放攻击)
- 缓存口令
针对口令传输的攻击
漏洞标准化研究
- CVE:Common Vulnerabilities & Exposures
- 漏洞字典:漏洞对应CVE编号
- CWE:Common Weakness Enumeration
- CWE是一种包括类缺陷、基础缺陷、变种缺陷等多层次的体系
- 字典视图:以字母表顺序排列
- 开发视图:针对软件开发者,以软件开发周期为参照分类
- 研究视图:这对学术界人士,从内在性质等方面分类
- CWE是一种包括类缺陷、基础缺陷、变种缺陷等多层次的体系
- CVE:Common Vulnerabilities & Exposures
典型漏洞类型
- 栈溢出
- 1986年首次出现真实攻击
- 进程使用系统内存从低到高四结构:栈、堆、数据段、文本(代码)段
- 栈空间是程序设计时规定好如何使用以及使用多少的内存空间(典型栈变量包括函数内部的普通变量、数组等)
- 栈帧(stack Frame):每个进程有一个栈,这个进程中每个函数被调用时分别再栈中占用一段区域
- 原理分析示例
1
2
3
4
5
6
7
8
9
int main(int argc,char *argv[])
{
char name[16];
strcpy(name,argv[1]);
printf("%s\n",name);
return 0;
}
- 堆溢出
- 堆结构特点
- 堆是程序运行时动态分配的内存(指不预先决定,需要参考用户反馈)
- 堆使用时需要程序员使用专用函数申请(如:C:malloc() ; C++:new())
- 一般一个堆指针来使用申请的内存,读写释放都通过这个指针完成
- 使用完毕后要通过释放函数回收内存,否则会造成内存泄漏(free() ; delete() )
- 现代操作系统的堆结构:
- 堆块:堆区内存按不同大小组织成块,以堆块为单元进行标识,而不是传统字节标识
- 块首:一个堆块头部的几个字节,用来标识这个块首自身信息。
- 块身:紧跟在块首后面部分,最终分配给用户使用的数据区。
- 堆表:一般位于堆区起始位置,用于检索堆区中所有堆块的重要信息,包括堆块的位置、大小、空闲或占用等。
- 堆块:堆区内存按不同大小组织成块,以堆块为单元进行标识,而不是传统字节标识
- 原理分析示例:
1
2
3
4
5
6
7
8
9
10
int main(int argc,char* argv[])
{
char *buf1;
buf1 = (char *)malloc(BUFFSIZE); //分配内存块
strcpy(buf1,argv[1]); //向buf1拷贝参数
printf("%s\n",buf1); //打印buf1
free(buf1);
return 0;
} - 堆溢出攻击思路
- 构造数据溢出下一个堆块的块首
- 改写块首的前向指针和后向指针
- 分配、释放、合并等操作发生时获得一次向内存任意地址读写任意数据的机会
- 堆结构特点
- 格式化串漏洞
- 格式化串:在print系列函数中按照一定的格式对数据进行输出(既可输出到标准输出,也可输出到文件句柄、字符串等)
- 格式化串漏洞原理:软件使用格式化字符串为参数,且该格式化字符串来自外部输入
- 输入格式化字符串参数”%n”:『将%n之前printf已经打印的字符个数赋值给偏移处指针所指向的地址位置』
- “%p”
- 优势:只要构造出指针就可以修盖内存中任何数值,攻击具有针对性。(栈溢出:地毯式轰炸)
- 整型溢出
- 存储溢出
- 运算溢出
- 符号溢出
- (UAF)释放再使用
- 栈溢出
溢出漏洞利用原理
漏洞利用保护机制
五、Web应用攻击
XSS攻击
1
<script>alert("err")</script>
- 主要类型
- 反射型【非持久】:输入攻击脚本直接返回到被攻击者浏览器
1
2http://www.example.com/test.php?
user=<script>alert('123')</script> //通过传递变量缺乏过滤进行执行 - 存储型【持久】:(一般用于论坛留言,评论,日志)将攻击脚本存储于服务器,受害者查看页面时执行
- DOM型(文档对象模型):针对web中的JavaScript代码的逻辑漏洞而执行攻击脚本
- 反射型【非持久】:输入攻击脚本直接返回到被攻击者浏览器
- 常用利用方法
- 注入条件:
- 用户能够控制输入
- 原本程序要执行的sql语句,拼接了用户输入数据
- 常用SQL注入
- Mysql
1
select 字段名 from 表名 where 条件 order by i limit m.n /*select一般语句*/
- php程序调用函数执行sql语句功能
1
xxx? id="select * from users where id=$id and pass='".$pass."'"; &pwd=
- Mysql
- 注入类型分类
- 按注入点类型
- 数字型(整型)
- 注入点类型为数字(整型),不需要使用引号闭合
1
"9 or 1=1 --"
- 注入点类型为数字(整型),不需要使用引号闭合
- 字符型
- 一般需要使用引号(单、双)满足sql语句引号闭合语法要求
1
"xx' or 1=1 --" --"xx":任意值 ; "--":注释符
- 一般需要使用引号(单、双)满足sql语句引号闭合语法要求
- 搜索型
- 数字型(整型)
- 按注入技术(执行效果)分类
- 基于布尔的盲注
- 在输入值后拼接布尔表达式(真值为0或1),通过回显信息的不同判断,某个参数是否为注入点
1
2
3
4
5/*1=1:真值为true*/
id = 3005 and 1=1 & pass= test
/*1=2:真值为false*/
id = 3005 and 1=2 & pass= test
/*若回显信息不同,则$id为注入点*/
- 在输入值后拼接布尔表达式(真值为0或1),通过回显信息的不同判断,某个参数是否为注入点
- 基于时间的盲注
- 使用一些时间函数,如延迟函数slee()
1
2id=3005 and sleep(3) &pass=test
/* web应用延迟3秒后显示登录失败,则$id注入点 */
- 使用一些时间函数,如延迟函数slee()
- 基于报错的注入
- 在php调用函数
?
后输入错误验证传递,观察错误信息中显示出的对应数据库函数,可判断数据库类型
- 在php调用函数
- 联合查询注入
- 堆查询注入
- 基于布尔的盲注
- 按注入点类型
- 常用判断/查找注入点
查看评论