Open×××的新钩子设计
open***是一個虛擬網(wǎng)卡和SSL相結(jié)合的***框架,使用虛擬網(wǎng)卡得到協(xié)議棧封裝數(shù)據(jù),然后通過ssl協(xié)議發(fā)送出去,此中重點在于:1.得到數(shù)據(jù);2.得到的數(shù)據(jù)是協(xié)議棧封裝好的數(shù)據(jù);3.通過openssl的接口進行發(fā)送。如果一個客戶終端沒有虛擬網(wǎng)卡的支持,或者沒有openssl庫,那么open***將運行不起來,然而沒有openssl的問題好解決,裝一個就是了,沒有虛擬網(wǎng)卡支持的問題就不好解決了,畢竟支持虛擬網(wǎng)卡需要操作系統(tǒng)內(nèi)核的驅(qū)動程序,安裝這個驅(qū)動程序要看操作系統(tǒng)同意與否,比如在linux上需要root權(quán)限,在windows2008之類的系統(tǒng)上需要微軟簽名等等,實為不便,于是考慮到stunnel的方式,在第七層設(shè)置一個代理,可以實現(xiàn)本地代理的方式而完全不使用open***,比如使用stunnel監(jiān)聽一個端口1234,然后將***的數(shù)據(jù)重新定向到這個1234端口,可以通過設(shè)置代理的方式,也可以通過iptables的REDIRECT的方式,可是又有問題了,這種方式雖然可以拿到需要代理的數(shù)據(jù),然而由于***的server端需要識別客戶端的“虛擬IP地址”,而stunnel卻不支持這個虛擬ip地址,它完全就是一個應(yīng)用層的代理程序,比如在服務(wù)端架設(shè)一臺open***服務(wù)器,啟動后其虛擬ip地址是172.16.1.1,它所接收到的數(shù)據(jù)是客戶端傳來的ip數(shù)據(jù)報或者以太幀,其攜帶的源ip必然要是172.16.1.0/24網(wǎng)段的才行,stunnel做不到這一點,因此必然需要一種辦法,不使用虛擬網(wǎng)卡,又必然要支持虛擬網(wǎng)絡(luò)。
???? 其實這個問題也好辦,我們可以自己封裝ip數(shù)據(jù)報或者以太幀,比如使用基于python的scapy就可以很方便的封裝任意的ip數(shù)據(jù)報或者以太幀,我們需要做的僅僅是將從scapy和open***結(jié)合起來,并且修改open***從虛擬網(wǎng)卡的字符設(shè)備讀取數(shù)據(jù)為從scapy讀取數(shù)據(jù),然后再寫一個一切和虛擬網(wǎng)卡接口的實現(xiàn),比如ifconfig之類,實現(xiàn)此ifconfig的時候,我們不必配置真的虛擬網(wǎng)卡,而是保存ip地址,掩碼信息以及mac信息在一個數(shù)據(jù)結(jié)構(gòu)中,然后scapy封裝數(shù)據(jù)報或者數(shù)據(jù)幀的時候從該數(shù)據(jù)結(jié)構(gòu)取出即可,另外要做的就是在本地起一個代理服務(wù),這是為了抓取需要通過***的裸數(shù)據(jù)。因此過程稱為:
1.修改后的open***+scapy偵聽1234端口;
2.修改瀏覽器的代理為本地的1234端口;
3.發(fā)送http請求,然后被open***+scapy得到;
4.open***+scapy通過open***服務(wù)器push過來的虛擬網(wǎng)絡(luò)配置信息封裝數(shù)據(jù)報(tun)或者數(shù)據(jù)幀(tap);
5.scapy封裝好的數(shù)據(jù)通過修改后的open***的tun.c中tun_read函數(shù)進入open***;
6.至此,open***絲毫不能確定數(shù)據(jù)來自虛擬網(wǎng)卡還是別的;
7.一切按照正常的流程通過ssl發(fā)送;
8.如果有數(shù)據(jù)報回復(fù),依然通過將修改后的tun_write將數(shù)據(jù)報(tun)或者數(shù)據(jù)幀(tap)發(fā)送給scapy,然后截掉協(xié)議頭信息;
9.將裸數(shù)據(jù)發(fā)送給瀏覽器,瀏覽器顯示之。
要點:
1.如果覺得python性能不夠,完全可以重新以本地語言c實現(xiàn)scapy;
2.本地代理服務(wù)要完全與stunnel的前期行為相似,一定保存好session之信息,只是stunnel代理客戶連接了真實的服務(wù)器,而open***+scapy卻將數(shù)據(jù)直接交給了scapy。
???? 總結(jié)起來就是,虛擬網(wǎng)卡僅僅是獲取數(shù)據(jù)的一種方式,通過本地代理或者遠程代理獲取數(shù)據(jù)然后在用戶空間封裝成ip數(shù)據(jù)報或者以太數(shù)據(jù)幀終成的數(shù)據(jù)是獲取數(shù)據(jù)的另外一種方式,可見必有第三種方式和第四種,因此將tun.c的接口抽取出來和實現(xiàn)相分離是一個很好的方向,后期可以將openssl也作為發(fā)送接口的一種方式,而其它的ssl實現(xiàn)可以作為另一種方式,至此,open***就完全變成了兩部分的固定接口:1.獲取封裝好的數(shù)據(jù);2.通過ssl發(fā)送數(shù)據(jù),然后1和2的實現(xiàn)作為鉤子提供給實現(xiàn)者,保留一個默認的實現(xiàn),那就是以虛擬網(wǎng)卡技術(shù)實現(xiàn)1,并且以openssl實現(xiàn)2。
轉(zhuǎn)載于:https://blog.51cto.com/dog250/1271139
總結(jié)
以上是生活随笔為你收集整理的Open×××的新钩子设计的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PowerShell2.0之Window
- 下一篇: 揭穿骗子阴谋,学会保护自己