最近學習網路攻防,卻不知道該怎麼看到程序的漏洞,希望有人能提供一點建議。可以推薦一下書目,或者是有用的網路課程。舉個例子吧

代碼能看懂就是不會操作漏洞,十萬火急,速來,跪謝!!


瀉藥。。

你隨便寫一個名字叫做env echo and now what? 的腳本放了/usr/bin下面。。。不就會執行任意程序了嗎= =


emmmmm,思維方式得靠練習的,多看看就知道了。問題中這種就是典型的代碼執行時可能會被混入其他的東西或被其他東西替代,像SQL注入之類的也是同樣的原理。


有源碼嗎?審計審計,一些邏輯錯誤什麼的,多看看多學學,挖洞不易,加油。

end


解題思路

1、首先觀察該程序的執行效果,結果為輸出and now what?

2、分析程序源代碼,我們可以看到程序調用setresuid()設置調用進程的真實用戶ID,有效用戶ID和保存的set-user-ID,調用setresgid()設置真正的GID,有效的GID和保存的set-group-ID;但上面這些並不是重點,關鍵點在於system("/usr/bin/env echo and now what?"),程序使用system函數執行指定的shell命令,而此處存在的漏洞在於echo是由env定位找到;因為env用來執行當前環境變數下的命令或者顯示當前的環境變數,也就是說env會依次遍歷$PATH中的路徑,執行第一次找到的echo命令,所以我們只要修改$PATH,就可以欺騙env,繼而使得代碼中的system執行我們的命令。

3、由於/tmp目錄對任何用戶都有完整的許可權,因此我們可以使用命令ln -s /bin/getflag /tmp/echo讓/tmp/echo鏈接到/bin/getflag上

4、使用命令export PATH=/tmp:$PATH修改環境變數,將tmp路徑放在前面,這樣env會首先在/tmp下找到echo並執行


沒有什麼印象了,看到now what就感覺這好像是Exploit-Exercises的原題吧?

要學會多用百度Yo~

關於黑客教程的話

歡迎搜索騰訊掌控安全學院


1. gets

gets()函數不檢查緩衝長度,可能導致漏洞。調用函數gets(buffer),會把用戶輸入的內容放在buffer中,但是對這個內容沒有檢查長度。如果用戶輸入內容過長,就會覆蓋在buffer之後定義的變數,也就是說用戶可以隨意更改一些程序中的變數。

使用fgets()函數更好一些。首先你要用malloc為buffer分配一部分固定的空間,然後調用fgets的時候傳遞進去預計長度的值,這樣就不會造成溢出了。

2. strcpy

這個家族有三個函數:strcpy、strcat和strcmp,都有溢出問題,因為不檢查長度。一種對應方法就是,在使用這些函數前加入檢查長度的語句。還有一種方法是使用strncpy、strncat和strncmp,是會檢查長度的版本,不過這種方法的問題是,如果截取了長度,不能保證字元串以』 』結尾,所以可能需要添加一些代碼判斷一下。

3. sprintf

這個函數的問題也是不檢查長度。使用snprintf更好一些。這個函數不僅能夠避免緩衝區溢出(檢查長度),還可以返回傳遞字元串的長度,以供判斷是否需要處理截取後的』 』結尾問題。

4. printf及相關函數

這一類的漏洞與字元串格式攻擊相關,也就是我們常說的利用格式化字元串漏洞進行攻擊。這種攻擊通常會導致信息泄露、覆蓋內存(%n)等等。這個漏洞可以被以下函數觸發:printf, fprintf, sprintf以及snprintf。這些函數的共同特點就是,都以格式化的字元串作為參數,即百分號之後的格式約定。

這種漏洞的應對方式就是,記住一定要硬編碼格式化字元串。

5. 文件打開

打開文件的時候要特別小心。文件處理可能有多種被攻擊的方法,這裡只介紹幾個例子。

一般來說我們在打開文件之前都會先確認文件是否存在,但是攻擊者可能會建立一個文件(甚至只是建立了一個重要系統文件的符號化鏈接),在你的檢查和實際使用文件之間的時候。open函數比fopen要更安全一些。在打開文件前,unlink文件以消除符號化鏈接。先用open函數生成一個文件描述符fd,如果fd為-1則打開文件失敗。然後再用fdopen來打開這個文件描述符所指的文件,如果之前有符號化鏈接,那麼因為被消除,這個文件就不能打開。


求黑客大牛或者團隊聯繫方式


推薦閱讀:
相关文章