黑客為什麼可以做到無需知道源碼的情況下找出系統漏洞?

題目可能不能表達完整我的意思,大體來說是:

我作為一個比較普通的程序員,要讀懂一個別人的源碼已經很不易了,還要從中找出漏洞。比如你把windows的源碼放我面前,我肯定看暈了,別說找漏洞了,何況windows還不開源。linux開源,我看的也很暈,只能一點點扣。還有web方面,不知道別人伺服器的源碼,怎麼找出別人伺服器的程序上的漏洞的呢。

所以我覺得黑客或者說安全人員一定有和軟體開發者不同的視角 ,來看待這個問題。

希望得到指教。謝謝!


首先,「比較普通的程序員」和能不能成為黑客之間沒有必然關係。黑客可能是很優秀的程序員,也可能不是。如果你看過 yuange 的程序,就會明白這一點。yuange 的編程能力比較差,編程習慣更差,整個兒就是一個編程反面教材的樣板。但是,這絲毫不妨礙他成為世界上最優秀的黑客之一。

「要讀懂一個別人的源碼已經很不易了」,這才是根源問題。無論有沒有源碼,黑客都必須要能分析、理解、推測程序實現,才能發現漏洞。這不是視角問題,是能力問題。這種能力在一定程度上可以訓練。


在網路滲透裡面,搞到對方的漏洞無疑是一個重點,拿到漏洞就意味著可以拿下對方,拿到漏洞就意味著可以一擊致命,拿到漏洞就意味著……

好啦,我來告訴你黑客是為什麼可以在不看源碼的情況下挖漏。

不看源碼搞系統的漏洞,這叫黑盒滲透。

不要以為不看源碼滲透掉某個系統要非常困難,相反,它甚至是比白盒滲透更為簡單。

在滲透者看來,白盒滲透是當你沒有思路去拿下對方伺服器的時候,才實施的一種攻擊方法。看源碼更容易發現對方的錯誤,一擊致命,這無可置疑。

但是很多情況下問題並不是這麼嚴重,就拿web安全來說,一般的sql注入、xss等漏洞在現在的網路中仍然隨處可見。而滲透者能夠準確無誤找到這些漏洞的原因,就是一個經驗。

熟練的滲透者,能夠根據一個系統中的功能、UI效果來判定這個系統可能存在的漏洞。比如看見圖片上傳就會想到可否存在上傳漏洞,看到留言板就總想帶進去一個script,看到id=xx這樣的url就喜歡注入一下試試,通過F12的抓包抓到一個api就想看看這個api可否利用……

常見的漏洞,就這麼八九不離十的被拿到了。

如果根據經驗發現不了這個網站的漏洞呢?

滲透著還有自己的獨門神器——掃描。

掃描,常見的掃描器一般都有jsky(感謝指正),wvs等等,這些掃描器的工作原理大致是如下的

1.爬蟲,爬遍你的整個網站,把所有可以直接或者間接訪問到的文件都給找到

2.猜解,掃描器內部內置了一些常見的文件名,比如admin、login這樣的名稱,掃描器自身會嘗試暴力猜解這些可能存在的目錄或者文件

3.爬robots,一般網站的robots.txt都是可以訪問的,爬蟲會根據裡面的內容進行目錄遍歷

4.接下來就是一大堆exploit各種上了

這樣下來之後,一個系統的漏洞也就被這麼挖出來了。


先說利用已知漏洞的,那都稱不上黑客。出補丁後反向工程的,那是別有用心的壞人。

我以為找未知漏洞的才能算黑客,而這些人大部分時候乾的都是體力活,比如緩衝區溢出這種就是寫fuzzing然後反覆試啊。當然如何寫高效的fuzzing有很多技巧。第一個想出sql injection的是天才,後面利用這個攻擊的就是反覆應用技巧了。

沒有別的意思,只是說當黑客真的需要很大的毅力和耐心。而一般程序員趕進度都來不及了,那有這個時間做fuzzing什麼的。投入高產出完全沒保障,可能什麼都找不出。大公司pen test也都是找外包做的,不是說沒人會做,是划不來,邊際效益太低。


最近在調教一批開發人員,這事搞了有一段時間了。

單點黑盒的摸索步驟,大家探討下:

1、了解確定這個系統的基本構成;包括它用了什麼OS,基於什麼DB,是基於什麼組件做的,背後的是用什麼支持的。搞測試而已,還是很友好的,一般都可以問。對方嘿嘿猥瑣一下,我們也嘿嘿,還可以猥瑣地猜么,業界主流的組件就那麼些。

2、用各種掃描器掃一下,看看對面開了哪些服務,這些服務的反應是什麼,從中可以判斷一些基本的指紋,跟步驟一核對。如果都是一些已知框架內的反應,沒有什麼特別的東西,呃,那就基本套准了,上自動測試套件驗證已知缺陷。對於經驗不足的開發方,這一步往往就可以發現很多東西,後面基本就可以算機械勞動了。

3、咦,這個通訊層/服務層/應用層的反應沒見過,可能是對方自己開發的東西,竊喜,自己編碼開發的玩意往往更搓,各個年份的OWASP測試用例拿出來試試,各種猥瑣流的注入、溢出、提權都試試;唉,構造測試套好煩,沒轍還是得一個個試,最起碼經典問題打一遍,邊界打一遍。

4、喔,有應用層的公眾服務啊,先註冊個帳號看看應用層都是怎麼跑的;順便上報文分析儀,看看它的通訊層和應用層夠不夠健壯,啥數據格式,都採用了哪些挫協議挫演算法;協議格式摸清楚,業務框架擬合出來,一個個注入試試,看看有沒有漏點啥玩意出來。順便打打流量和別的東西,消耗一下資源,看看會不會崩潰啥的。

5、咦,居然有防溢出呢,居然有轉義呢,對面看來受過基本的訓練哈。我草居然BAN掉我了,對面難道有應用層防火牆?土豪!要慢慢試試看這防火牆都能ban掉些啥,知己知己百戰不殆。

Team B你們別閑著!拿人錢財與人消災,反正大家都別閑著。

對面的組件是這些,大概的性能是這樣的,趕緊上網找源碼去!百合也可以很猥瑣的,模擬一下環境會死啊,STRIDE一下會死啊,廢話都知道這事比較枯燥,先看看有多少節點可以改!

我槽剛發現這個問題居然自己兩個月前評論過……難道最近縱慾過度?

心好累,待續。


一個小偷要進入一座大樓偷東西,他並不需要知道大樓裡面的各種情況,完全可以憑藉豐富的經驗,聰明的大腦,快速的反應,進入大樓以後見招拆招,躲避安全防護,清理自己的腳印,最後滿載而歸。

你說你看不懂Linux 代碼,是因為你看的少,寫的代碼少,多練練沒什麼問題。


你一定不知道作為黑盒小王子的我

╮( ̄▽ ̄)╭


如果開發做的多,能把源代碼大致估摸個差不多,相同的業務邏輯,100個人95個人寫的代碼都差不多,出漏洞的地方也差不多,100個程序員裡面傻逼佔60。我經歷過的crack我都稱為我運氣好和對方傻逼,我技術實力並不咋地,只是各種語言各種演算法各種類別各種架構各種框架代碼寫的多,全憑感覺。(什麼支付寶啊12306啊這種大團隊的不在我回答之列)大多數政企系統都還是一個人或者小團隊做的,大團隊如果管理不特別嚴謹,再牛逼的團隊,都有傻逼程序員捅簍子。人一多可就不好保證100%的牛逼程序員


模糊測試 強制發掘安全漏洞的利器


干軟體測試的很多人連代碼都看不懂。

人家一樣給你找一堆bug。

題主你到底干過軟體沒有,怎麼會有這種問題?


要拆掉一座房子你不一定要知道這房子是怎麼蓋的,你只需要找到一個好位置放炸藥


這個問題有意思。我玩軟體破解比較多,網站攻擊只知道一些概念。軟體破解有個高大上的名字叫逆向工程(reverse engineering)就軟體破解而言,定點找漏洞和順便找漏洞,思路是很不同的。前者可能需要別的答案里提到的自動測試工具,大量給各種隨機輸入,希望觸發程序崩潰。後者,就是在你用一個程序,好好的突然crash了,這就意味著你碰到bug了。普通用戶碰到bug很鬱悶,但是玩逆向分析的人會意識到這很可能是個可以利用的漏洞,比如緩衝區溢出之類,然後如果這個組件在某個網路組件里用到,那就可能從網上遠程利用了。

至於分析工具的話,有的工具很牛逼的,比如最新的ida可以啟發式的把彙編代碼反編譯成c語言,儘管比起實際c語言代碼還差很多,但可讀性已經大大增強了,分析bug也比以前容易多了。

也有些漏洞可能是軟體開發人員無意發現的,比如涉及某個開源軟體包的二次開發,對代碼太熟悉了,以至於碰到bug突然意識到這其實可以怎麼利用。其實大部分軟體開發人員不會去想一個bug怎麼能被用來攻擊,沒有黑客那種削尖腦袋找門道的思維習慣。如果有的話,找到可以利用的bug還是有很多機會的。


知道了源碼就能找出漏洞?我自己寫的都不知道


找漏洞是有技巧的,這也是為什麼越有經驗的人找漏洞的速度會越有優勢.

1:關於網站的黑盒測試其實就是找幾個點,比如埠啊,什麼地方可能會有邏輯漏洞啊,需要傳遞參數的地方的sql注入,xss什麼的,經驗豐富的人有時候真的是一看就知道哪裡有漏洞了然後進行各種探測證實自己的猜想。所以這不需要知道源碼是怎樣的,返回信息暴露一切。

2:關於伺服器上的漏洞,先通過各種探測了解伺服器的基本信息,再根據基本信息進行搜索提權方式再一個方式接一個方式地試根據返回信息判斷是否成功直到提權成功或者用完了所有的方式都沒成功最後放棄。所以,這個也不需要知道源碼

3:關於系統漏洞挖掘方面沒有做過,但是從之前學逆向的經驗看來系統漏洞挖掘也是有幾個點的,測試的時候也是根據執行後的返回信息進行判斷,所以也不需要知道源碼。

4:其實在知道源碼的情況下挖掘漏洞一般也不會把全部的源碼看一遍再去找的,也是去找幾個點,比如需要邏輯判斷的地方,比如參數傳遞的地方等。

以上只是從自己的一些經驗以及和別人交流的時候總結的,但是也不一定每個挖掘漏洞的人都是這樣的


一般情況下,找漏洞都是沒有源碼的,因為軟體不是你的。

常見的漏洞有操作系統漏洞、伺服器漏洞、伺服器軟體漏洞、網頁系統漏洞。

先說軟體方面的漏洞,不是網頁系統的:

一般的漏洞大家聽過的應該是緩衝區溢出漏洞,什麼意思呢?就是存變數的緩衝區超過了最大大小,文本就會衝掉軟體本來的代碼,造成錯誤。

緩衝區是內存中存放數據的地方。在程序試圖將數據放到及其內存中的某一個位置的時候,因為沒有足夠的空間就會發生緩衝區溢出。緩衝區溢出就好比是將十升水放進只有五升容量的桶里。很顯然,一旦容器滿了,餘下的部分就會溢出在地板上,弄得一團糟。

舉個栗子,登錄系統(不管是網頁還是軟體、ftp等),都要輸入帳號密碼,進行身份認證,系統接受你輸入的帳號密碼,要保存到一個變數里(通常是堆棧),和正確的帳號密碼比較,看你是否是合法的用戶。如果我定義一個變數用來存放你輸入的密碼(假設最多1000位密碼),一般人的密碼肯定到不了1000位,那麼程序就會正常運行,如果有別有用心的人輸入了2000位,多餘的"1000個字元由於沒有位置放,就會衝掉正常的指令,程序就會崩潰。

程序最終都會編譯成機器碼,一行一行的執行,多餘的1000個字元衝掉正常的指令後,機器不能識別,就會報錯退出,把這1000個字元也換做編譯後的機器碼,程序執行到這裡以後,就執行我們的代碼了,這就是緩衝區溢出漏洞。

不管是操作系統還是瀏覽器,只要接入互聯網是,就要按照一定的協議收發數據,只要接收的數據沒有進行邊界檢查,就可能造成溢出漏洞。

找漏洞的人就是這樣,先使程序崩潰,找到有可能有漏洞的地方,再逐語句調試,這是個非常複雜的過程,不過最終都能夠找到合適的shellcode使對方機器執行我們的指令。


在無數次試錯的前提下,不小心歪打正著。

當然這一定範圍的試錯,是通過各方面判斷出來的,並非毫無目的的隨意試錯。


我連煮飯都有可能糊鍋

但是我知道頂級大廚的菜到底是咸了還是淡了,油放多了還是少了

有必然的聯繫嗎?


黑盒測試和白盒測試不一樣


好比建築師專註於怎麼蓋房子,而入侵者專註於破窗開鎖,開鎖匠無需懂房間的構造而只需精通進出的門窗


我來幫題主翻譯下:

為什麼那麼多人在不了解女人生理構造的情況下,能讓女生高潮?

答:黑盒測試。


自己寫過足夠多的程序,就知道陷坑在哪裡,長什麼樣


推薦閱讀:

學習網路安全時遇到瓶頸了該怎麼辦?
網路安全工作中,你干過哪些引以為傲的「猥瑣」行為?
挖掘二進位漏洞具體指的是什麼?
想出一個防盜版和防破解的好招?
立志在網路安全領域發展,應該如何系統學習安全知識?

TAG:程序員 | 網路安全 | 黑客Hacker | 系統漏洞 |