1. 程式人生 > >漏洞資訊獲取

漏洞資訊獲取

最近鬥哥在逛某論壇的時候,看到有人提出一個問題:“如何快速獲取第一手漏洞資訊,可否介紹一些第一手漏洞資訊的獲取渠道?”so...雷厲風行的鬥哥這就為大家帶來了介紹。

漏洞資訊的獲取渠道

1.網站 https://seclists.org/fulldisclosure/

任何黑客都會告訴你,在任何網站上都找不到最新的新聞和漏洞,甚至沒有。而在這裡,一個公共的,與供應商無關的論壇,最新的漏洞有時會在Bugtraq稽核通過之前數小時或數天出現在此列表中。
 



2.網站 https://www.exploit-db.com/

Exploit-DB是一個CVE相容的公共漏洞和相應易受攻擊軟體的存檔,開發供

滲透測試人員和漏洞研究人員使用。目標是通過直接提交,郵件列表以及其他公共資源提供最全面的漏洞利用集合,並將其呈現在一個免費且易於導航的資料庫中。漏洞利用資料庫是漏洞利用和概念驗證的儲存庫,而不是建議,使其成為那些需要立即採取可操作資料的人的寶貴資源。
 


3.網站 https://www.openssl.org/news/vulnerabilities.html

Struts2是apache專案下的一個web 框架,普遍應用於阿里巴巴、京東等網際網路、政府、企業入口網站。在過去的幾年內,幾乎每年Struts2都會爆出存在嚴重安全漏洞,蘋果、中國移動、中國聯通、百度、騰訊、淘寶、京東、Sohu、民生銀行等大型企業的網站均遭毒手,運維工程師苦不堪言。故該框架的官方安全公告也是鬥哥關注的一個物件。
 


4.網站 https://www.openssl.org/news/vulnerabilities.html

OpenSSL是為網路通訊提供安全及資料完整性的一種安全協議,囊括了主要的密碼演算法、常用的金鑰和證書封裝管理功能以及SSL協議,目前正在各大網銀、線上支付、電商網站、入口網站、電子郵件等重要網站上廣泛使用,使用了存在漏洞的OpenSSL版本,使用者登入該網站時就可能被黑客實時監控到登入賬號和密碼等敏感的資訊。所以該協議漏洞應該特別值得關注。
 


自動化漏洞資訊採集

1. 漏洞資訊採集

接下來,我們可以寫一段python程式碼,對上述四個網站進行漏洞資訊的採集:

對Seclists網站的採集程式碼如下:

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

# 獲取seclists完全漏洞列表

 

def seclists(time):

 

   result = []

 

   time = time.split("-")

 

   # 漏洞列表網址 [url]https://seclists.org/fulldisclosure/2018/Jan/date.html[/url]

 

   url = 'https://seclists.org/fulldisclosure/%s/%s/date.html' % (time[0], time[1])

 

   # 獲取GET響應html

 

   html = get(url).text

 

   try:

 

       vulnerablelist = \

 

           re.findall('<h4>%s, %s %s</h4>\n<blockquote>(.*?)</blockquote>' % (time[4], time[3], time[2]), html, re.S)[

 

               0].split('\n')

 

   except IndexError:

 

       vulnerablelist = []

 

 

 

   for vulnerable in vulnerablelist:

 

       vulnerabledict = {}

 

       if vulnerable == "":

 

           continue

 

       vulnerable_href = re.findall('href="(.*?)"', vulnerable, re.S)[0]

 

       vulnerabledict["name"] = re.findall('">(.*?)</a>', vulnerable, re.S)[0]

 

       # 漏洞詳情頁面網址 [url]https://seclists.org/fulldisclosure/2018/Nov/0[/url]

 

       vulnerabledict["url"] = "https://seclists.org/fulldisclosure/%s/%s/%s" % (time[0], time[1], vulnerable_href)

 

       result.append(vulnerabledict)

 

   return result




對Exploit-DB網站的採集程式碼如下:

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

# 獲取exploit_db漏洞列表

 

def exploit_db(time):

 

   result = []

 

   url = "https://www.exploit-db.com/?draw=1&columns%5B0%5D%5Bdata%5D=date_published&columns%5B0%5D%5Bname%5D=date_published&columns%5B0%5D%5Bsearchable%5D=true&columns%5B0%5D%5Borderable%5D=true&columns%5B0%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B0%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B1%5D%5Bdata%5D=download&columns%5B1%5D%5Bname%5D=download&columns%5B1%5D%5Bsearchable%5D=false&columns%5B1%5D%5Borderable%5D=false&columns%5B1%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B1%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B2%5D%5Bdata%5D=application_md5&columns%5B2%5D%5Bname%5D=application_md5&columns%5B2%5D%5Bsearchable%5D=true&columns%5B2%5D%5Borderable%5D=false&columns%5B2%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B2%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B3%5D%5Bdata%5D=verified&columns%5B3%5D%5Bname%5D=verified&columns%5B3%5D%5Bsearchable%5D=true&columns%5B3%5D%5Borderable%5D=false&columns%5B3%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B3%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B4%5D%5Bdata%5D=description&columns%5B4%5D%5Bname%5D=description&columns%5B4%5D%5Bsearchable%5D=true&columns%5B4%5D%5Borderable%5D=false&columns%5B4%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B4%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B5%5D%5Bdata%5D=type_id&columns%5B5%5D%5Bname%5D=type_id&columns%5B5%5D%5Bsearchable%5D=true&columns%5B5%5D%5Borderable%5D=false&columns%5B5%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B5%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B6%5D%5Bdata%5D=platform_id&columns%5B6%5D%5Bname%5D=platform_id&columns%5B6%5D%5Bsearchable%5D=true&columns%5B6%5D%5Borderable%5D=false&columns%5B6%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B6%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B7%5D%5Bdata%5D=author_id&columns%5B7%5D%5Bname%5D=author_id&columns%5B7%5D%5Bsearchable%5D=false&columns%5B7%5D%5Borderable%5D=false&columns%5B7%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B7%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B8%5D%5Bdata%5D=code&columns%5B8%5D%5Bname%5D=code.code&columns%5B8%5D%5Bsearchable%5D=true&columns%5B8%5D%5Borderable%5D=true&columns%5B8%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B8%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B9%5D%5Bdata%5D=id&columns%5B9%5D%5Bname%5D=id&columns%5B9%5D%5Bsearchable%5D=false&columns%5B9%5D%5Borderable%5D=true&columns%5B9%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B9%5D%5Bsearch%5D%5Bregex%5D=false&order%5B0%5D%5Bcolumn%5D=9&order%5B0%5D%5Bdir%5D=desc&start=0&length=120&search%5Bvalue%5D=&search%5Bregex%5D=false&author=&port=&type=&tag=&platform=&_=1543280866340"

 

   my_headers = [

 

       "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36"]

 

   random_header = random.choice(my_headers)

 

   req = urllib2.Request(url)

 

   req.add_header("User-Agent", random_header)

 

   req.add_header("GET", url)

 

   req.add_header("Host", "www.exploit-db.com")

 

   req.add_header("Referer", "https://www.exploit-db.com/")

 

   req.add_header("X-Requested-With", "XMLHttpRequest")




對Struts 2安全公告的採集程式碼如下:

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

# 獲取Struts 2安全公告

 

def struts(time):

 

   result = []

 

   time = time.split("-")

 

   # time = 14 November 2018

 

   # 漏洞公告網址 [url]https://struts.apache.org/announce.html[/url]

 

   url = 'https://struts.apache.org/announce.html'

 

   # 獲取GET響應html

 

   html = get(url).text

 

   vulnerablelist = re.findall('<ul id="markdown-toc">\n(.*?)\n</ul>', html, re.S)[0].split('\n')

 

   for vulnerable in vulnerablelist:

 

       vulnerabledict = {}

 

       vulnerable_name = re.findall('">(.*?)</a></li>', vulnerable, re.S)[0]

 

       if "%s %s %s" % (time[3], time[2], time[0]) in vulnerable_name:

 

           vulnerable_href = re.findall('href="(.*?)"', vulnerable, re.S)[0]

 

           vulnerabledict["name"] = vulnerable_name

 

           vulnerabledict["url"] = url + vulnerable_href

 

           result.append(vulnerabledict)

 

       else:

 

           break

 

   return result



對Openssl安全公告的採集程式碼如下:

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

# 獲取Openssl安全公告

 

def openssl(time):

 

   result = []

 

   time = time.replace("-", "")

 

   # 漏洞公告網址 [url]https://www.openssl.org/news/vulnerabilities.html#[/url]

 

   url = 'https://www.openssl.org/news/vulnerabilities.html'

 

   # 獲取GET響應html

 

   html = get(url).text

 

   bs = BeautifulSoup(html, "lxml")

 

   vulnerablelist = bs.find_all('dt')

 

   for vulnerable in vulnerablelist:

 

       vulnerabledict = {}

 

       vulnerable = str(vulnerable)

 

       try:

 

           vulnerable_time = re.findall('<a href="/news/secadv/(.*?).txt">', vulnerable, re.S)[0]

 

           if vulnerable_time == time:

 

               vulnerabledict["name"] = \

 

                   re.findall('">(.*?)</a> <a href="/news/secadv/%s.txt">' % vulnerable_time, vulnerable, re.S)[0]

 

               vulnerabledict["url"] = re.findall('<dt><a href="(.*?)" name="', vulnerable, re.S)[0]

 

               result.append(vulnerabledict)

 

           else:

 

               break

 

       except IndexError:

 

           continue

 

   return result



將上述採集到的資訊結果記錄到檔案,poython程式碼如下:

001

002

003

004

005

006

007

008

009

010

011

012

013

014

015

016

017

018

019

020

021

022

023

024

025

026

027

028

029

030

031

032

033

034

035

036

037

038

039

040

041

042

043

044

045

046

047

048

049

050

051

052

053

054

055

056

057

058

059

060

061

062

063

064

065

066

067

068

069

070

071

072

073

074

075

076

077

078

079

080

081

082

083

084

085

086

087

088

089

090

091

092

093

094

095

096

097

098

099

100

101

# 獲取漏洞資訊並寫入檔案

 

def get_information(t):

 

   # 格式化時間

 

   time = t.strftime('%Y-%m-%d') # time = "2018-11-26"

 

   TIME = t.strftime('%Y-%b-%B-%d-%A') # TIME = "2018-Nov-November-26-Tuesday"

 

   # 建立結果檔案

 

   f = open('%s.txt' % time, 'a+'# 若是'wb'就表示寫二進位制檔案

 

 

 

   now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')

 

   print u'[%s]開始收集今日安全漏洞公告' % now

 

 

 

   # 獲取各大網站安全公告,並寫入檔案

 

   now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')

 

   print u'[%s]開始獲取Seclists安全公告' % now

 

   vulnerable_seclists = seclists(TIME)

 

   now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')

 

   print u'[%s]獲取結果寫入檔案: %s.txt' % (now, time)

 

   f.write(u'<Seclists安全公告>\n')

 

   for vulnerable in vulnerable_seclists:

 

       f.write(u'安全公告:%s, URL:%s\n' % (vulnerable["name"], vulnerable["url"]))

 

 

 

   now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')

 

   print u'[%s]Exploit_DB安全公告' % now

 

   vulnerable_exploit_db = exploit_db(time)

 

   now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')

 

   print u'[%s]獲取結果寫入檔案: %s.txt' % (now, time)

 

   f.write(u'<Exploit_DB安全公告>\n')

 

   for vulnerable in vulnerable_exploit_db:

 

       f.write(u'安全公告:%s, URL:%s\n' % (vulnerable["name"], vulnerable["url"]))

 

 

 

   now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')

 

   print u'[%s]Struts安全公告' % now

 

   vulnerable_struts = struts(TIME)

 

   now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')

 

   print u'[%s]獲取結果寫入檔案: %s.txt' % (now, time)

 

   f.write(u'<Struts安全公告>\n')

 

   for vulnerable in vulnerable_struts:

 

       f.write(u'安全公告:%s, URL:%s\n' % (vulnerable["name"], vulnerable["url"]))

 

 

 

   now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')

 

   print u'[%s]Openssl安全公告' % now

 

   vulnerable_openssl = openssl(time)

 

   now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')

 

   print u'[%s]獲取結果寫入檔案: %s.txt' % (now, time)

 

   f.write(u'<Openssl安全公告>\n')

 

   for vulnerable in vulnerable_openssl:

 

       f.write(u'安全公告:%s, URL:%s\n' % (vulnerable["name"], vulnerable["url"]))

 

 

 

   f.close()

 

   now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')

 

   print u'[%s]今日安全漏洞公告收集完成,收集結果請檢視: %s.txt' % (now, time)



2.自動化任務

接下來,我們只需要設定一個簡單的定時器即可,例如預設每天晚上23時指令碼開始自動採集漏洞資訊。當然,也可以自定義採集時間。程式碼如下:

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

# 每天h時m分開始執行任務,預設23時

 

def main(h=23, m=0):

 

   while True:

 

       now = datetime.datetime.now()  # print(now.hour, now.minute)

 

       if now.hour == h and now.minute == m:

 

           get_information(now)

 

           # 每隔60秒檢測一次

 

           time.sleep(60)

 

if __name__ == '__main__':

 

   main(h=9, m=12)




總結

本期漏洞資訊自動化獲取就介紹到這裡啦!