2014年1月9日 星期四

socat 的實用技巧:將 proxy 放在 tor 前面

許多知名網站都會封鎖  tor 網路,這個時候可以將代理伺服器放在 tor 線路的末端,讓最後顯示的 IP 是代理伺服器的 IP,但是我們又是透過 tor 去連上它,所以也不怕陌生的代理伺服器其實是 honey pot 的可能性,我們可以使用 socat 或是 ncat 來達成這個目的。

socat (socket cat) 是一個複雜的小工具,大多數人都應該聽過 nc (net cat),或者 Nmap 開發團隊所開發的 ncat,事實上 socat 就是一個很像 ncat 的工具,不過 socat 的使用思維完全是以 relay 的角度來思考。

舉例來說,如果連到 www.google.com:80,使用 ncat 的話如下:
$ ncat www.google.com 80

使用 socat 的話如下:
$ socat - www.google.com:80

再舉一例,我們要連到 www.gov.tw:80,如果透過 ncat,指令如下:
$ echo -e "GET / HTTP/1.1\r\nHost: www.gov.tw\r\n\r\n" | ncat www.gov.tw 80

而透過 socat 的話,指令如下:
$ echo -e "GET / HTTP/1.1\r\nHost: www.gov.tw\r\n\r\n" | socat - TCP:www.gov.tw:80

可以看到關鍵在於 socat 指令後面接的 - 符號,代表 STDIN,所以 socat 的思維,是將兩個對象(在此是 STDIN 和 www.gov.tw:80)連接起來;而 ncat 的思維則是以 STDIN 為輸入,單單連線到一個對象的概念。當然 ncat 可以做到大部份 socat 能夠做到的事情,甚至更多,不過就建立 relay 來說,socat 的思維比較直觀。

回到標題,假設我們想要讓 tor 出去的前端再連到一個 proxy,然後才連到目的地,示意圖如下:
你的電腦 <----> Tor 節點 1 <---> Tor 節點 2 <- ... -> Tor 節點 N <---> Proxy <---> 目的地

預設 tor 監聽於 127.0.0.1:9050(請自行換成你的設定位址),假設 proxy 的位址是 http://proxy.example.org:8888(請自行換成你的代理伺服器位址與通訊埠),你的 socat 指令可以這麼下:
$ socat tcp-listen:10001,bind=127.0.0.1,reuseaddr,fork socks4a:127.0.0.1:proxy.example.org:8888,socksuser=nobody,socksport=9050

這會讓 socat 建立一個通道,從本機端 10001 進入 tor 的線路,然後再連線到 proxy.example.org:8888,如果 proxy.example.org:8888 是 http proxy,你就可以把 127.0.0.1:10001 當作是 http proxy 來使用,如果它是 socks proxy,請繼續往下閱讀。10001 可以換成你想要監聽的通訊埠。

我們保留此 socat 指令繼續執行,此時打開另一個視窗,輸入下列指令:

$ curl ifconfig.me
[螢幕輸出:你的真實IP]

$ curl -x socks://127.0.0.1:9050 -p ifconfig.me
[螢幕輸出:tor exit node 的 IP]

$ curl -x http://127.0.0.1:10001 -p ifconfig.me
[螢幕輸出:proxy 的 IP (經過 tor exit node 再連到此 proxy)]

網站 ifconfig.me 是個特別的網站,您可以連看看 (http://ifconfig.me),當你透過瀏覽器連線的時候,伺服器會從 HTTP 表頭裡面偵測到,並且吐給你一個正常的網頁,請自己試試看。當你透過 curl 連線的時候,因為 curl 會送出 user agent 等表明自己是 curl 的資訊,所以 ifconfig.me 的伺服器就只會回傳你的真實 IP,其實也就是從網際網路上看到的,你的 IP。有些時候 ifconfig.me 不穩定,如果它連不上的時候,您可以使用其他辨識你 IP 的網站,DuckDuckGo 或者其他搜尋引擎是您的好朋友。

回過頭來,上面三行指令,第一行會顯示你的真實 IP。第二行指令,透過 tor 監聽於 127.0.0.1:9050 的預設位址連線,參數 -x 是讓 curl 使用代理伺服器,也就是 socks://127.0.0.1:9050,參數 -p 是讓 curl 將連線全部透過代理伺服器傳送,詳情請參考 curl 說明文件。如果你不知道什麼是 curl,可以 google 一下。

關鍵是第三行指令,因為它是透過 socat 所建立的通道,將此通道當作 http 代理伺服器連線到 ifconfig.me,所以你看到的是有別於 tor 的 IP。至此我們已經成功在 tor 的前端安置別的代理伺服器了。

這樣的用途在於,部份網站會將所有 tor exit node 當作黑名單,如果你透過 tor 連上它們,會自動啟動它們的安全驗證機制,或者甚至直接把你擋在門外,這些網站例如臉書、Google、維基百科,或者是一些註冊 email 帳號的網站等等。但是假設你想要徹底的匿名,連上網路上不明來路的代理伺服器或者 VPN 線路可能更危險,所以組合 tor 加上代理伺服器就變得很有意義了,這樣一來,你可以躲在 tor 的黑色叢林之中,又可以找一個漂白過的代理伺服器裝在線路的前段,以避免被臉書或者維基百科阻擋在門外。

這是想要徹底匿名的一個實際作法,因為完全無法追蹤你的來源位址。

但是記得,如果你傳送的資料是明文,資料仍有可能在 tor exit node 和代理伺服器兩處地方被攔截,只是你的來源位址無法被追蹤。因此建議使用 tor 最好要記得這一點,也就是來源無法被追蹤,但是資料除了 https (ssl/tls)、ssh 等加密的連線以外,以明文傳遞的資料都可能在線路出口處被攔截。

如果你不知道什麼是 tor,可以 google 一下。

回到正題,剛剛是以 curl 為例,當然你也可以在瀏覽器設定代理伺服器的地方,設定 127.0.0.1:10001 為 http 代理伺服器。如果你的代理伺服器 proxy.example.org 是 socks 伺服器,上面的 socat 參數不用改,只要直接改應用程式端的代理伺服器設定即可,以 curl 為例,上面第三個指令從:
$ curl -x http://127.0.0.1:10001 -p ifconfig.me
改成
$ curl -x socks://127.0.0.1:10001 -p ifconfig.me

如果是瀏覽器,設定代理伺服器的類別為 socks 即可。

如果你的應用程式不支援代理伺服器,請參考使用 proxychains,不知道 proxychains 的朋友,可以到 GitHub 上面找找,我也有一篇相關又不那麼相關的文章

socat 的下載可以到這裡來,建議使用 1.7.x.x 的最新版本,Ubuntu 提供的 socat 不支援 READLINE 功能,有點虛,你可以下載原始碼自己編譯,1.7.x 的版本通常編譯沒什麼問題,至少在我的機器上很 ok。
./configure && make && sudo make install 即可。

補充說明:
如果同樣目的,想要使用 ncat 來達成的話,指令可以這麼下:
$ ncat -l -k localhost 10001 --sh-exec "ncat --proxy 127.0.0.1:9050 --proxy-type socks4 proxy.example.org 8888"

ncat 可以在 nmap 套件裡面找到。proxy.example.org 可替換成您的代理伺服器,8888 換成代理伺服器所開的 port。

以上,祝使用愉快 ^_^

1 則留言: