如何成為一名駭客
2021-10-15 19:51:59 Author: medium.com(查看原文) 阅读量:43 收藏

berming

記得在我小時候曾玩過一款線上遊戲,我把我身上的總財產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 學習筆記


文章来源: https://medium.com/@ktecv2000/%E5%A6%82%E4%BD%95%E6%88%90%E7%82%BA%E4%B8%80%E5%90%8D%E9%A7%AD%E5%AE%A2-a298082f3c6a?source=rss-eb87faee21ca------2
如有侵权请联系:admin#unsafe.sh