如何成為一名駭客

b3rm1nG
10 min readFeb 12, 2018

--

記得在我小時候曾玩過一款線上遊戲,我把我身上的總財產100元拿去買了遊戲點數,用這些錢買了強力的裝備,不料過了幾天之後裝備就憑空消失了,我的幼小心靈就隨著這100元的消逝而破碎了-這就是我第一次接觸到駭客,以受害者的身分。

之後一直到接觸了這個領域前,我一直認為駭客就是在偷別人的100元、偷看你的FB訊息、偷看你的IG私人帳號,又或是把你的首頁換成色情網站,再強一點的可能就是像電影一樣,爬個叫什麼防火牆的牆後去發射核彈,駭客應該就是這樣......吧?

到了接觸安全領域至今兩年左右,雖然程度仍然很差,但就是想利用這個時間點,這個還了解普通人對於這個領域的疑問、還銘記著初學者會碰到的問題、以及對學習上會撞到的困難歷歷在目的時間點來帶領各位揭開駭客的神秘面紗。

駭客在做什麼?

如果你立志要成為一名廚師,你可能會為了「想做出好吃的料理」而行動,然而這只是目的,你平時其實大部分是在學習使用廚具、烹煎蒸炒、熟稔各式食譜、調味等等......

那麼駭客在做什麼?當然不是像之前說的那樣偷100元偷密碼偷資料發射核彈(誤,這只是其中一個目的而已(發射核彈除外),駭客平常多半花心力在研究安全知識發現漏洞以及破解漏洞

什麼是漏洞?

覺得公眾場合那些需要密碼的Wi-Fi很煩人嗎?試試看"123456"吧,覺得你的伴侶是不是在外面偷吃,想看看他的手機對話紀錄?那密碼試試看他的生日吧。這些事情其實都算是漏洞的一種,但當然這些只是很表層的部分,下面我將從三種安全領域切入來介紹何謂漏洞

  1. Web

假如今天你登入了一個網站,你看到了登入畫面,這是瀏覽器將前端語言(HTML、CSS、JavaScript)的結果呈現在你眼前,而與前端安全相關的漏洞有XSS

XSS是injection的一種,什麼是injection呢?這裡我拿一個很棒的youtube影片舉例-Burger Injection

簡單來說,他用網路點了漢堡來吃,並且備註欄留下了:

XX漢堡 請給我不同的醬汁

但餐點送到後,由於點單內容和備註欄位字體長的很像,外送員也許在匆忙的情況下誤認為這個「XX漢堡」也是點單的內容,於是他就拿到了一份免費的XX漢堡。

誤把資料當成指令執行或資料造成了非預期的指令執行,這就是injection,而XSS就只是這個「XX漢堡」變成了像是JavaScript等前端語言而已。

另外一個injection的例子甚至是一個人的人名,他的名字讓他免費住了好幾間旅館。

24歲的Raven Felix Null來自美國,他說他成年之後就將姓氏改為「Null」這個單詞,它與許多電腦程式不相容,因此許多系統不會將他當做一個人來看待。

這種程式設計錯誤意味著,當一位員工將Null這個單詞當做姓氏輸入IT系統之後,該系統會將這個單詞識別為「資料空缺」,並拒絕驗證它。這種IT小故障常常使得Raven不必為他買的東西付錢。

出處 : http://hottopic.chinatimes.com/20160401004005-260804

天啊,連Name Injection都存在這個世界上了,想成為駭客嗎?還不快去改名!

咳咳...回到前面的例子,當我們在網站按下登入時,我們的資料被傳到了伺服器進行驗證,這時就牽扯到了後端安全(伺服器處理登入驗證動作),例如後端語言PHP安全;資料庫安全(儲存你的帳號密碼等),例如SQL injection(沒有錯又是injection);以及傳輸協定安全(資料傳送給伺服器),例如HTTP/HTTPS安全等。而你登入之後就可以一段時間內維持登入,這是因為伺服器對你進行了認證,這時又牽扯到了認證安全,例如Cookie / Session安全。

說了那麼多是否有點眼花撩亂、沒有實感呢?別灰心,研究Web的漏洞是相對簡單的(以入門而言),甚至你馬上就可以來試試看SQL injection

SQL是一個和資料庫溝通的語言,例如你登入的時候,後台的SQL的語句可能會長這樣:

SELECT * FROM user WHERE name= 'XXX' and password = 'OOO' ;

翻譯一下:

幫我找一下 使用者 是不是有 名字是 'XXX' 和 密碼是 'OOO'

你可以發現你輸入的資料都被一組單引號包了起來,這樣電腦就能區別那些是資料了,那麼假設你自己輸入單引號會發生什麼事情?有問題的網站可能就會報Error,因為程式錯把你的單引號當成真正的單引號了,導致單引號沒有成對存在之類的語法錯誤。

那如果你輸入了以下語句

' or 1=1 -- 

那麼整句話就變成 (粗體為你輸入的資料)

SELECT * FROM user WHERE name= '' or 1=1 -- and password = 'OOO' ;

兩個橫槓 "--" 代表註解,也就是在他後面的語句程式都不會理會他,所以整句話實際變成

SELECT * FROM user WHERE name= '' or 1=1

再度翻譯

幫我找一下 使用者 是不是有 名字是 '' 或 1等於1
=> 是,登入成功

你在沒有帳號密碼的情況下就登入成功了!當然不只是能登入,既然資料庫都以為你說的話是指令了,你當然能做其他事情

What?!就這樣嗎!是的,而且千萬不要認為這很蠢或是不可能,這裡提供一份google找到的清單全部都是2017年有SQL injection漏洞的網站,實在是超級多啊,這還只是google隨便搜到的其中一個清單而已,甚至是你使用的學校/公司網站都非常有可能有這類漏洞(你可以自己試試看)。

(ps. 那份清單的URL末端會經常看到 %27,那就是在URL底下的單引號 )

每次談到SQL injection我腦中就會浮出一則笑話

有天有個記者訪問了三隻企鵝

記者:「請問你們平常都在幹嘛?」

第一隻企鵝:「吃飯,幹活,打東東」

第二隻企鵝:「吃飯,幹活,打東東」

第三隻企鵝:「吃飯」

記者:「你為什麼只有吃飯?」

第三隻企鵝:「...」

記者:「我知道了,你該不會是東東吧」

第三隻企鵝:「不是,我是活。」

多一個injection,多一個被X的活,認同請分享。

2. Reversing

以前日治時期的臺灣庶民,擁有了一些機會到日本工廠參觀,這時他們會分工,每個人負責把工廠某區看到的所有東西全部用眼睛記下來,這樣既使他們沒看見機台裡面實際運作情況,也能從外部行為來推敲,進而有機會掌握當時日本的技術,這其實就是逆向工程。

而駭客的Reversing就是在缺少原始碼的情況下分析程式,例如遊戲外掛就是逆向的一種,而藉由逆向分析程式後就能更清楚了解程式運作,進而找出漏洞,像是你使用了一個試用版軟體,而試用期一到他便跳出一個視窗要你輸入註冊碼什麼的繼續使用,假設這個軟體的驗證寫的很簡單,例如

IF 試用期結束
SHOW 過期視窗
驗證碼 = 輸入
IF 驗證碼 is "FUKREGISTRATIONCODE"
繼續使用

藉由逆向你可以分析程式發現”FUKREGISTRATIONCODE”這串驗證碼,或是在記憶體中找到這串驗證碼。

IDA Pro逆向日常,看一堆反組譯碼來分析程式行為,進而找出漏洞。

3. BINARY (PWN)

比起前面REVERSING是比較靜態的(當然也有動態),PWN就更動態一些,也就是你不只要用肉眼看,你還要去執行程式,去看看各種不同的輸入對於程式狀態造成的改變,通常漏洞可以讓你對記憶體造成非原預期的讀/寫,並精心安排這些動作來取得控制權。

PWN日常,用debugger(GDB)觀察程式狀態

常見的漏洞類型有overflow(stack/heap base)、use-after-free

關於overflow我用以下簡單的登入程式碼作為示範

密碼[16]
登入 = False
...
IF not 登入
輸入密碼
IF (密碼 is ...) or (登入 is True)
登入成功

可以看到儲存密碼的空間只有16個單位,此時你輸入16個以上,並剛好登入在記憶體中被擺在了密碼後面,那麼你輸入的資料就會覆蓋掉登入,而程式語言通常非0就會被視為True,也就是你在不知道密碼的情況下成功登入了。

其中我也寫了一些關於PWN的文章,有興趣請參閱。

緩衝區溢位攻擊之一(Buffer Overflow)

Heap Exploit 學習筆記

如何學習當駭客?

上述說了那麼多,終於可以來呼應本文標題-「如何成為一名駭客」,不過在進入真正主題「該學習哪些東西」之前,我想先問幾個更加重要的問題。

1. 你有動機嗎?

這也許是最重要的問題,遠比之後的問題都還要重要。雖然我不想嚇跑想接觸這個領域的人,但我必須說老實的和你說-

學習Hacking真的很難

尤其資安是一門很冷門的領域,他不像AI、大數據什麼的,你在不懂的情況下還能自我催眠學習這個對未來很有幫助,也不像學習一門程式語言這樣,你能夠有很棒的蜜月期,更不像其他領域一樣,網路學習資料、書籍、線上課程族繁不及備載,這些全部沒有,如果Hacking入門有曲線,那麼一開始將是很可怕的垂直懸崖

或許你可以不管這個問題,就是心血來潮、覺得很酷所以進來了解一下/玩一下,當然可以,但我會覺得很可惜,因為通常進來的人一下子後大部分都會離開,俗話說「師父領進門,修行在個人」,但是資安師父我猜是會打人,讓許多新手全部都被打跑,並且就不再接觸這個領域了,所以倒不如等到真的有個強烈念頭真的想玩這門領域之後再一次栽進來。

2. 玩資安要具備什麼特質/能力?

其實特質我倒覺得沒那麼重要,但是硬要說的話我認為有幾個。

  • 英文

中文資源幾乎是沒有,要學習只能看英文了。

  • 自學能力

有人可能會覺得到哪裡都看的到自學能力,煩不煩,但是我要說的是,學習Hacking所需的自學能力可能比你一生接觸的其他領域都還高,就像我當然可以說學習Hacking需要很多背景知識,但是說實在哪個領域不需要?然而學習Hacking其實背景知識相比其他領域來說並不那麼絕對,而所需自學能力卻比其他領域要求更高。

  • 相信自己很棒

這篇文章並不是心靈雞湯,但是還是要告訴你/妳,必須相信自己。因為在學習資安的過程,會不斷地遭遇挫折,會經常認為自己為什麼那麼笨,或是看到太多高手而自相慚。

  • 某個領域的基礎

並非必要,只是在學習時會比較有方向感,且挫折感不會那麼大,至於是那些基礎下面會談到。

3. 玩玩CTF吧!

Capture The Flag,簡稱CTF,簡單來說透過各種方式取得Flag得分,Flag取得方式根據題型(領域)有所不同,例如在Web題型中你可能就要以admin身分登入,在Reversing題型中他可能是如同前面提到註冊碼的方式存在,在Pwn題型中你就要對漏洞應用來取得遠端控制權等......

為什麼要玩CTF呢?首先現實世界很危險的,亂玩是有法律責任的,馬上有人會來查水錶,而CTF的題目其實就是簡化版的真實世界,小型的程式讓你可以省去較多的垃圾資訊而專注在研究漏洞上,也能和其他玩家互相切磋、學習。

更詳細的介紹我放在我的github裡面介紹了各領域的學習方向、一些給初心者的建議以及一些很棒的玩CTF的網站,非常建議有興趣接觸Hacking的人可以從玩CTF開始。

結語

其實我不但非資工本科系(本科系還相去甚遠),甚至到大學才開始自學程式,並且直到快大三才接觸資安,條件已經算是很差的了,但一路學了快兩年才發現條件其實不重要,重要的是...

1u8t 64ck 70r 4un 4n5 64ck 40r 1i73 :)

--

--