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