一、ARP协议问题
1. ARP协议的作用是什么。
32位IP地址和48位MAC之间的转换。(广播询问,单播答复)
2. 引入ARP缓存的功能是什么。
将这一映射关系保存在 ARP 缓存中,使得不必重复运行 ARP 协议。
3. ARP缓存中毒的攻击方法和效果是什么。
- 方法:因为 ARP 缓存中的映射表并不是一直不变的,主机会定期发送 ARP 请求来更新它的 ARP 映射表,利用这个机制,攻击者可以伪造 ARP 应答帧使得主机错误的更新自己的 ARP 映射表,这个过程就是 ARP 缓存中毒。
- 效果:要么使主机发送 MAC 帧到错误的 MAC 地址,导致数据被窃听;要么由于 MAC 地址不存在,导致数据发送不成功。
预防
(1)小型网络
静态IP地址和静态ARP映射表。
(2)大型网络
“端口安全” 功能是允许你强制使你的交换机在每个端口只允许 (IP地址对应的) 一个MAC地址通过。这个功能会阻止黑客改变他机器的MAC地址或试图映射多个MAC地址到他的机器上。
(3)一般网络
ARP监视工具,比如ARPwatch,当有不正常的ARP通信时它会提醒你。
# 攻击前需要清除本机ARP缓存
arp -n #查看arp表
arp -d address #删除一个arp表项
arp -s address hw_addr #设置一个arp表项
# -e为MAC地址,-i为被攻击主机的IP地址,netwox是一个发包工具
netwox 80 --eth "00:00:00:00:00:00" --ip "192.168.224.134"
二、IP协议安全问题
1. 为什么IP要进行分片?
考虑到效率和正确性,每一种物理网络都会规定链路层数据帧的最大长度,称为链路层MTU。在以太网的环境中可传输的最大IP报文为1500字节。
2. IP分片如何进行重组?
在IP头里面16bit的TOTAL LENGTH
表示当前的分片长度。16bit的IDENT
唯一记录了一个IP包的标识符,用以确定分片是否属于同一个数据包,具有同一个IDENT的IP分片才会从新组装。13bit的片偏移FRAGMENT OFFSET
记录了一个IP分片相对于整个数据包的位置。3bit的标志位FLAGS
记录了该分片后面是否还有新的分片,第一位现在一般都是0,表示未使用)、第二位为DF(don‘t fragment)、第三位为MF(more fragment)。根据这三个数据段来进行重组。
3. 泪滴攻击(teardrop)的原理是什么?
原理,在于构造两个分片。其中,第二个分片完全包含在第一个分片中。也即,第二个分片的FO大于第一个分片的FO,但是第二个分片的FO+ Len,都小于第一个分片最后一个字节的位置,也即第一个分片的FO+len。计算出end - offset
为负数。
攻击的成功,依赖于一种当分片发生重叠时,主机使用第一个分片来覆盖第二个分片的重叠内容。
防范:丢弃FO == 1片段;限制最小数据传输大小。
4. 包过滤防火墙,通过过滤SYN包,防止外部链接。攻击者可以如何绕过这个过滤?
利用微小碎片攻击。由于每个互联网模块最小能够转发68个八位字节的数据报,不允许进一步分段。这是因为IP头部最多可达60个八位字节,最小片段为8个八位字节。而重要的传输头信息(例如,TCP头的CODE字段)可能超出了第8个数据八位字节。这就可以构造一个68字节的IP数据报分片,数据部分只有8字节,而包含控制位SYN信息的数据部分(SYN TCP数据报中控制位为头部的13字节之后)在第二个分片中,这样就可以通过第一次包过滤,不检查之后的数据包信息。
三、ICMP协议安全
1. 什么是SMURF攻击?如何防止?
Smurf攻击是一种分布式拒绝服务攻击,其中使用IP广播地址将具有预期受害者的欺骗源IP的大量互联网控制消息协议(ICMP)分组广播到计算机网络。 默认情况下,网络上的大多数设备都会通过向源IP地址发送回复来对此做出响应。 如果网络上接收和响应这些数据包的机器数量非常大,受害者的计算机将忙于处理ping回复包。 这可能会使受害者的计算机变慢,无法继续工作。
预防:(1)配置各个主机和路由器不响应ICMP请求或广播;(2)配置路由器不转发定向到广播地址的数据包。
2. 什么是ICMP重定向攻击?如何防止?
主机假设路由器的信息更权威,当主机ICMP重定向功能开启时,攻击者冒充默认网关,给目标主机发送ICMP重定向报文,报文中的重定向地址为虚假不可达的、网络不通的或攻击者主机的地址。当目的主机收到ICMP重定向报文后,就会对路由表进行添加、修改,将重定向的IP地址设置为指定目标之间的通信网关IP地址,使得通信失败或者拦截通信数据包。
预防:
(1)网关端:变长子网掩码划分网段;使用网络控制列表(ACL)和代理。
(2)主机端:关闭ICMP重定向(accept_redirects);可以使用防火墙等过滤掉ICMP报文,或使用反间谍软件监控;结合防ARP、IP欺骗等进行防御。
# ICMP重定向攻击,-f为过滤器,-g为重定向的网关IP,-i为原来的网关IP
$ sudo netwox 86 -f "host ${被攻击主机ip地址}" -g "${新指定的网关ip地址}" -i "${当前网关ip地址}"
四、TCP协议安全
1. 什么是SYN flooding攻击?效果是什么?如何防止?
利用TCP三次握手的原理。当应用开放了一个TCP端口后,该端口就处于侦听状态,不停地监视发到该端口的SYN报文,一旦接收到SYN报文,就需要为即将建立的TCP连接分配TCB(Transmission Control Block),通常一个TCB需要280~1300个字节;并且进入半开连接状态,也即收到SYN包而还未收到ACK包时的连接状态。操作系统实现的最多可开启的半开连接个数是一定的,譬如512,而受到内存的限制,可能还达不到这个数字。
效果:如果半开连接的个数过多,就会消耗掉可用的内存,使得新的正常的连接请求不能被处理或者处理的非常慢。
预防:
(1)SYN Cache。每次来了SYN包,那么就在SYN Cache队列中生成一个项,保持一些基本信息;然后在收到ACK时检查SYN Cache队列,如果能找到合适的项,那么开始建立TCP连接,然后删除SYN Cache中的项。
(2)SYN Cookie。在ACK到达之前不分配任何资源,服务器构造TCP SYN + ACK数据包中的seq为特定的初始值,即SYN Cookie。
sudo netwox 76 -i ${攻击IP地址} -p ${端口号}
2. 端口扫描的原理是什么?
首先一个个地尝试与一些端口的连接,如果端口有响应,并且能够建立起连接,那么就能够判断得出来,这个端口是open的,之后主动发出RST中断即可。如果是close的端口,那么会收到主机主动的发送一个RST数据包。
3. namp -sS和nmap -sT的区别是什么?
tcp connect(-sT)扫描,和TCP SYN(半开-sS)扫描。可以判断三种状态。
普通权限会建立了连接,连接记录被主机log下来;超级权限下可以只发送第一次握手数据包,之后RST,不会建立完整的连接。
4. nmap -sA扫描的原理是什么?
作用是判断端口有没有被过滤。
nmap会构造一个ACK数据包(设置A。CK位)并发送给目的主机的某一端口。对于端口,不管是开放的还是关闭的,如果收到一个不请自来的ACK数据包,都会发一个RST包。而如果端口被防火墙过滤了,则不会对该数据包作出响应。
补充:nmap -sF/-sX/-sN作用是验证端口是否关闭,关闭时回复RST,打开和过滤不回复。namp fragment扫描(-f)将数据包拆分成若干个。
5. nmap idle扫描的原理是什么?
每发一个IP数据包,很多操作系统对identifier字段简单地增加1;
(1)发送SYN/ACK探测Zombie的RST中IP ID并记录下来;
(2)扫描这个RST数据包,并伪造Zombie主机发送SYN数据包给目标主机。目标端口开启,Zombie主机会给目标主机发送一个RST,IP ID加1;端口关闭或过滤,则会忽略收到的RST;
(3)再探测Zombie主机的IP ID,比较两次得到IP ID值。如果IP ID多了2则表示目标端口开启,多了1表示目标端口关闭,大于2表示多发了数据包。
注明:隐蔽且可以绕过防火墙,但是无法区分端口关闭和过滤的情况。
五、防火墙。
1. iptables是状态防火墙。状态防火墙相比于包过滤防火墙的优点是什么?
-
包过滤防火墙
通过ACL(Access Control List)规则控制数据流的。IP数据包中最明显最核心的五元素就是,源地址、目标地址、协议、源端口sport、目标端口dport。包过滤主要也就是根据这些包头部的元素进行判断。缺点:是1. 难以处理分片【IP碎片攻击】。2. 不支持某些复杂的协议。3. 不能防止应用层等恶意攻击,原因很简单,因为它根本不识别应用层的数据。
-
应用级网关代理防火墙
优点:对数据的控制直接上升到应用层,对数据包检测非常充分。
缺点:同时为了实现这一点,对于每一个服务应用,写要编写特定的安全代理程序,也即相应的客户端与服务器端程序。 -
状态检测防火墙/动态包过滤防火墙
通信过程中的会话数据包不是一个个完全独立的数据包,而是有前后连接状态的。在接收到连接建立请求时,就可以建立一张表,在表中存储相关的各个连接的信息,建立连接状态规则,基于这个表对进入和出去的数据包进行匹配。优点:由于不需要对每个数据包进行规则检查,而是一个连接的后续数据包直接进行状态检查,从而使得性能得到了较大提高;而且,由于状态表是动态的,因而可以有选择地、动态地开放关闭端口,使得安全性得到进一步地提高;隔离客户端和服务器,充当代理。
2. NAT的作用是什么?
NAT(网络地址转换)是一种把内部私有网络地址(IP地址)翻译成合法网络IP地址的技术。因此NAT在一定程度上,能够有效的解决公网地址不足的问题。
NAT表用于IP地址或端口的转换,一般用于共享上网或特殊端口的转换服务。(s/d/pnat,地址/目标地址/目标端口转换)
3. sudo iptables –P INPUT DROP; iptables -A INPUT -p tcp --sport 80 -j ACCEPT 这两条语句的作用是什么?
(1)在INPUT链中制定丢弃/过滤所有目的地址是本机的数据报的策略;(-P,制定链表的策略)
(2)在INPUT链尾增加一条过滤规则,接收目的地址是本机,源端口是80的tcp数据包。(-A,追加新规则于指定链的尾部)
TYPE(8-bit): identifies the message,可以用于–icmp-type类型
0:Echo Reply (ICMP Echo即ping)
3:Destination Unreachable
5:Redirect (change route)
8:Echo Request
filter的五条链:
PREROUTING链(处理目的地址)上一般的动作是DNAT,而POSTROUTING链(处理源地址)上的动作一般是SNAT。
六、Rootkit
1. 什么是rootkit?
Rootkit是一种黑客安全工具,用于捕获进出计算机的密码和消息流量,允许黑客为系统提供后门,掩盖系统被破坏的事实,等等。其三要素是:隐藏、操纵、收集数据。
Rootkit的作用在于“能维持root权限的一套工具”。它的目的是隐藏自己以及恶意程序,达到长期在目的主机存在并收集信息的目的。Rootkit一般和后门等程序结合使用,帮忙隐藏后门的踪迹。
2. LKM的好处是什么?
可加载内核模块(Loadable Kernel Module,LKM),是一段运行在内核空间的代码,可以动态热加载,可以访问操作系统最核心的部分。
不用重新编译内核和重启系统。
优点:动态加载,在不重编译内核和重启系统的条件下对类Unix系统的系统内核进行修改和扩展。否则的话,对Kernel代码的任何修改,都需要重新编译Kernel,大大浪费了时间和效率。
补充——权限:
当用户需要改变权限的时候,就需要更换用户ID或者组ID。为了实现这种机制,引入了真实UID(real UID)、有效UID(effective UID)以及 保存的UID(saved set-user-ID)的概念。
Root作为特权用户,UID=0;新注册用户一般是1000开始。使用getuid()和geteuid()可以获得当前进程的真实ID和有效ID。
中断向量表(128号异常处理函数sys_call)、系统调用表
3. 请描述系统调用劫持的过程。
为了篡改系统调用服务例程sys_xyz()。
(1)我们首先需要找到sys_call_table的地址(虽然32位和64位计算机有所不同,但是思路都是先找到系统处理函数地址,反汇编找到系统调用表SCT地址)。sys_call_table的地址是加载内核之后形成的,因此不同的系统的值也不一样。
(2)篡改系统调用,将SCT表中指向正常的系统调用的指针,改成我们自己的函数地址。首先,要对SCT取消写保护,通过设置cr0寄存器的WP位为0,禁止CPU上的写保护。写完之后恢复写保护,防止SCT被其他进程意外篡改。
(3)实现自己的系统调用函数,一般来说,主要是对系统原有的结果进行过滤,注意需要从用户态将数据拷贝到内核态。
方法:修改虚拟文件系统、利用IDT表找到SCT位置、用自己的中断描述符替换0x80
4. 请解释,为何Unix可以做到一切皆文件。
虚拟文件系统(Virtual File System, 简称 VFS), 是 Linux 内核中的一个软件层,用于给用户空间的程序提供文件系统接口;同时,它也提供了内核中的一个抽象功能,允许不同的文件系统共存。系统中所有的文件系统不但依赖 VFS 共存,而且也依靠 VFS 协同工作。
为了能够支持各种实际文件系统,VFS 定义了所有文件系统都支持的基本的、概念上的接口和数据结构;一个实际的文件系统想要被 Linux 支持,就必须提供一个符合VFS标准 的接口,才能与 VFS协同工作。
相同API的I/O操作
(1)向上,对应用层提供一个标准的文件操作接口;
(2)对下,对文件系统提供一个标准的接口,以便其他操作系统的文件系统可以方便的移植到Linux上;
(3)VFS内部则通过一系列高效的管理机制,使得底层文件系统不需沉溺到复杂的内核操作,即可获得高性能;
(4)此外VFS把一些复杂的操作尽量抽象到VFS内部,使得底层文件系统实现更简单。
更高层次的系统调用如下:
sys_getdents-> iterate_dir-> struct file_operations 里的iterate->省略若干层次 -> struct dir_context 里的actor(mostly filldir)。
要达到隐藏文件的目的,我们需要hooking filldir,在hooking function中去掉我们需要隐藏的文件记录,不填到缓冲区,这样应用程序就收不到相应的记录,也就打到了隐藏文件的目的。
具体思路是hooking相应目录的iterate,把dir_context的actor改为fake filldir,fake filldir把隐藏的文件过滤。
七、缓冲区溢出
缓冲区溢出就是写入到缓冲区或者从缓冲区读取的数据超出了缓冲区可以容纳的范围。
esp指向堆栈顶部的地址;ebp指向堆栈底部的地址;eip指向当前正在执行的指令的地址。
1. 什么是返回地址?
当一个程序调用一个函数时,该函数会开始调用其他函数等操作,然后返回调用它的函数。要返回调用函数,必须有一个调用函数的记录:执行应该从函数调用指令后的指令恢复。该指令的地址称为返回地址。
每当调用一个函数时,返回地址都会被压入堆栈。每当函数返回时,返回地址都会从堆栈中弹出,处理器开始执行该地址的指令。
2. 汇编语言中,call指令的作用是什么?
系统调用指令,保护当前程序上下文,软中断切换至内核态,执行调用函数。即将先将call指令的下一条指令的CS和IP入栈;再转移到调用的子程序。
操作数?
3. 请描述当函数调用发生时,进程地址空间中栈帧的变化。
函数调用指令call执行时,堆栈指针esp递减4个字节(32位),并且调用后的指令地址(返回地址)被写入现在由esp引用的存储器位置,即返回地址被压入栈。然后将eip设置为指定为要调用的操作数的地址,并从该地址继续执行。
调用函数执行完毕,函数返回指令ret执行(不占用任何操作数),处理器首先从esp中包含的内存地址中读取值,然后将esp增加4个字节 ,从堆栈中弹出返回地址。 eip设置为此值,并从该地址继续执行。返回调用前上下文。
4. 如何防止缓冲区溢出攻击。
(1)OS:为了防御缓冲区溢出攻击,编译器进行了canary金丝雀保护(在缓冲区和控制信息间插入一个 canary word,看这个值是否被修改)和防止栈运行等防御。
(2)为了防止猜测栈起始地址,栈起始地址随机化(randomize_va_space)。
(3)限制可执行代码的区域,判断ret地址区域是否改变。
破解:将 ShellCode 放在 large_string 的中部,而前面则一律填充为 NOP 指令(NOP 指令是一个任何事都不做的指令,主要用于延时操作),只要猜测的地址落在NOP指令串中,程序就会一直执行到shellcode。
攻击原理:将shellcode置于内存的某处,然后通过缓冲区溢出将返回地址指向shellcode。