Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

自幼受貴州大山的薰陶,養成了誠實質樸的性格。經過寒窗苦讀,考入BIT,為完成自己的教師夢,放棄IT、航天等工作,成為貴財一名大學教師,並想把自己所學所感真心傳授給自己的學生,幫助更多陌生人。


一.為什麼使用Python做網絡攻防


網絡攻防通常包括七個步驟:(圖源自張超大神)


偵查: 漏洞挖掘

武器製作:攻擊、載荷

分發:垃圾郵件等

利用:漏洞利用

安裝:惡意代碼、網頁

遠程控制:殭屍網絡

行動

:竊密、破壞、跳板

為什選擇Python作為開發工具呢?

真正厲害的安全工程師都會自己去製作所需要的工具,而Python語言就是這樣一個利器。Python開發的平臺包括Seebug、TangScan、BugScan等。在廣度上,Python可以進行蜜罐部署、沙盒、Wifi中間人、Scrapy網絡爬蟲、漏洞編寫、常用小工具等;在深度上,Python可以實現SQLMAP這樣一款強大的SQL注入工具,實現mitmproxy中間人攻擊神器等。由於Python具有簡單、易學習、免費開源、高級語言、可移植、可擴展、豐富的第三方庫函數特點,Python幾行代碼就能實現Java需要大量代碼的功能,並且Python是跨平臺的,Linux和Windows都能使用,它能快速實現並驗證我們的網絡攻防想法,所以選擇它作為我們的開發工具。


那麼,我們又可以用Python做什麼呢?


目錄掃描:Web+多線程(requests+threading+Queue),後臺、敏感文件(svn|upload)、敏感目錄(phpmyadmin)。

信息蒐集:Web+數據庫,中間件(Tomcat | Jboss)、C段Web信息、蒐集特點程序。例如:搜索某個論壇上的所有郵箱,再進行攻擊。

信息匹配&SQL注入:Web+正則,抓取信息(用戶名|郵箱)、SQL注入。

反彈shell:通過添加代碼獲取Shell及網絡信息。

接下來我們開始學習Python正則表達式、Python Web編程和Python網絡編程。建議讀者做好以下準備:


2.至少看一本關於Python的書籍

3.會使用Python自帶的一些功能,學習閱讀源代碼

4.閱讀官方文檔,尤其是常用的庫

5.多練習,多實戰

舉個簡單Python示例,通過import導入擴展包base64,它是將字符串base64加解碼的模塊, 通過print dir(base64)、help(base64)可以查看相關功能。

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

輸出結果如下圖所示,包括查看源代碼文件位置和“eastmount”轉碼。

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)


二.Python正則表達式


(一) 正則表達式基礎


在使用正則表達式之前,我們需要基本瞭解Python基礎知識、HTTP協議,熟悉使用BurpSuite、SQLMAP工具。Python正則表達式被廣泛應用在爬蟲開發、多線程、網絡編程中,而hacker應用也會涉及到正則表示式相關知識,比如掃描、爆破、POC等。


正則表達式(RegEx)使用單個字符串來描述、匹配一系列符合某個句法規則的字符串。例如,如果想獲取裡面的ip地址,就需要使用正則表達式實現。Python通過re模塊提供正則表達式的支持,其基本步驟如下:


先將正則表達式的字符串形式編譯我Pattern實例(compile)

使用Pattern實例處理文本並獲得匹配結果(match find findall)

使用實例獲得信息,進行其他的操作( 匹配結果)

舉一個簡單例子:

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

輸出結果為:

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

1.點(.)表示匹配任意換行符“\\n”以外的字符。

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

輸出結果為:[‘tt’, ‘tm’, ‘t.’, ‘th’],依次匹配t加任意字符的兩個字符。

2.斜槓(\\)表示匹配轉義字符 如果需要匹配點的話,必須要\\轉義字符。


Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

輸出結果為:[’.’, ‘.’, ‘.’]。


3.[…] 中括號是對應位置可以是字符集中任意字符。

字符集中的字符可以逐個列出,也可以給出範圍,如[abc]或[a-c],第一個字符如果是^表示取反,如 [ ^ abc]表示不是abc的其他字符。例如:a[bcd]e 能匹配到 abe、ace、ade。


4.匹配數字和非數字案例。

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

輸出結果如下圖所示:

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

正則表達式較為難理解,更推薦讀者真正使用的時候學會去百度相關的規則,會使用即可。同時,更多正則表達式的使用方法建議讀者下來之後自行學習,常見表如下圖所示。

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

(二) 常用正則表達式規則

下面講解比較常見的正則表達式規則,這些規則可能會對我們的網絡攻防有一定幫助。

1.獲取數字

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

輸出結果為:[‘1.45’, ‘5’, ‘6.45’, ‘8.82’]

2.抓取標籤間的內容


Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

輸出結果為:

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

3.抓取超鏈接標籤間的內容

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

輸出結果部分內容如下所示,這裡如果採用“print u”或“print t”語句直接輸出結果,可能會是中文亂碼,則需要調用函數unicode(u,‘utf-8’)轉換為utf-8編碼,正確顯示中文。

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

4.抓取超鏈接標籤的url

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

獲取的超鏈接輸出結果如下圖所示:

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

5.抓取圖片超鏈接標籤的url和圖片名稱

在HTML中,我們可以看到各式各樣的圖片,其圖片標籤的基本格式為“< img class="lazy" data-original=圖片地址 />”,只有通過抓取了這些圖片的原地址,才能下載對應的圖片至本地。那麼究竟怎麼獲取圖片標籤中的原圖地址呢?下面這段代碼就是獲取圖片鏈接地址的方法。

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

其中圖片對應的原圖地址為“http://www.yangxiuzhang.com/eastmount.jpg”,它對應一張圖片,該圖片是存儲在“www.yangxiuzhang.com”網站服務器端的,最後一個“/”後面的字段為圖片名稱,即為“eastmount.jpg”。那麼如何獲取url中最後一個參數呢?

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

更多正則表達式的

用法,讀者結合實際情況進行復現。

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)


三.Python Web編程


這裡的Web編程並不是利用Python開發Web程序,而是用Python與Web交互,獲取Web信息。主要內容包括:


urllib、urllib2、requests

爬蟲介紹

利用Python開發一個簡單的爬蟲

(一) urllib\\\\urllib2


urllib是Python用於獲取URL(Uniform Resource Locators,統一資源定址器)的庫函數,可以用來抓取遠程數據並保存,甚至可以設置消息頭(header)、代理、超時認證等。urllib模塊提供的上層接口讓我們像讀取本地文件一樣讀取www或ftp上的數據。它比C++、C#等其他編程語言使用起來更方便。其常用的方法如下:


urlopen(url, data=None, proxies=None)

該方法用於創建一個遠程URL的類文件對象,然後像本地文件一樣操作這個類文件對象來獲取遠程數據。參數url表示遠程數據的路徑,一般是網址;參數data表示以post方式提交到url的數據;參數proxies用於設置代理。urlopen返回一個類文件對象。

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

該段調用調用urllib.urlopen(url)函數打開百度鏈接,並輸出消息頭、url、http狀態碼等信息,如下圖所示。

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

urlretrieve(url, filename=None, reporthook=None, data=None)

urlretrieve方法是將遠程數據下載到本地,參數filename指定了保存到本地的路徑,如果省略該參數,urllib會自動生成一個臨時文件來保存數據;參數reporthook是一個回調函數,當連接上服務器,相應的數據塊傳輸完畢時會觸發該回調,通常使用該回調函數來顯示當前的下載進度;參數data指傳遞到服務器的數據。下

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

urllib2中調用的方法為:urllib2.urlopen()、urllib2.requests()。


(二) requests


requests模塊是用Python語言編寫的、基於urllib的第三方庫,採用Apache2 Licensed開源協議的http庫。它比urllib更加方便,既可以節約大量的工作,又完全滿足http測試需求。requests是一個很實用的Python http客戶端庫,編寫爬蟲和測試服務器響應數據時經常會用到。推薦大家從 requests官方網站 進行學習,這裡只做簡單介紹。


假設讀者已經使用“pip install requests”安裝了requests模塊,下面講解該模塊的基本用法。


1.發送網絡請求

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

2.為URL傳遞參數

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

輸出結果如下圖所示,將參數進行了拼接。

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

3.響應內容

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

4.二進制響應內容

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

5.定製請求頭

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

注意:headers中可以加入cookies

6.複雜的POST請求

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

7.響應狀態碼和響應頭

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

8.Cookies

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

9.超時

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

10.錯誤和異常遇到網絡問題(如:DNS查詢失敗,拒絕鏈接等)時,requests會拋出一個ConnectionError異常;遇到罕見的無效HTTP響應式時,requests則會拋出一個HTTPError異常;若請求超時,會拋出一個Timeout異常。

(三) 網絡爬蟲案例


網絡爬蟲又稱為網頁蜘蛛,網絡機器人,網頁追逐者,是按照一定規則自動抓取萬維網信息的程序或腳本。最大好處是批量且自動化獲得和處理信息,對於宏觀或微觀的情況都可以多一個側面去了解。在安全領域,爬蟲能做目錄掃描、搜索測試頁面、樣本文檔、管理員登錄頁面等。很多公司(如綠盟)的Web漏洞掃描也通過Python來自動識別漏洞。


下面以ichunqiu為例(https://www.ichunqiu.com/courses),使用requests爬取它的課程信息。我們打開第二頁,發現URL沒有變換,說明它是POST傳遞數據,接下來我們使用BurpSuite進行分析。

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

前面的文章詳細講解了BurpSuite如何配置,這裡就不再贅述,直接使用即可。但是由於目標網站是HTTPS協議,作者嘗試安全證書,但最終都無法成功訪問該網址,總是如下圖所示訪問證書網站。所以最後換了目標網站,其原理都是一樣的,後續繼續深入研究該問題。

[網絡安全自學篇] 三.Burp Suite工具安裝配置、Proxy基礎用法及暴庫示例

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

下面兩個案例雖然簡單,卻能解決很多人的問題,希望讀者可以嘗試下。

1.設置消息頭請求假設我們需要抓取360百科的喬布斯信息(https://baike.so.com/doc/24386561-25208408.html),如下圖所示。

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

傳統的爬蟲代碼會被網站攔截,從而無法獲取相關信息。

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

右鍵審查元素(按F12),在Network中獲取Headers值。headers中有很多內容,主要常用的就是user-agent 和 host,它們是以鍵對的形式展現出來,如果user-agent 以字典鍵對形式作為headers的內容,就可以反爬成功。

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

代碼如下:

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

有部分網站會返回Json格式的數據,我們可以通過json模塊進行處理。核心代碼如下:

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

2.提交數據請求

部分網站如果涉及到翻頁,需要獲取所有頁碼的信息,最傳統的方法是定義一個函數,然後設計一個循環,一次遍歷不同頁面的內容實現。核心代碼如下:

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

但如果URL始終保持不變,就需要我們深入地分析,或通過Selenium模擬瀏覽器抓取,這裡提供一個技巧性比較強的方法。


正如 博客園zhaof大佬 的文章,我們想爬取上海人民法院的開庭公開信息,但通過翻頁發現這個頁面的url地址是不變的,所以這裡我們大致就可以判斷出,中間表格的數據是通過js動態加載的,我們可以通過分析抓包,找到真實的請求地址。

目標網址:http://www.hshfy.sh.cn/shfy/gweb2017/ktgg_search.jsp

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

通過審查元素可以發現有個pagesnum變量,它標記為我們的頁碼,所以這裡需要通過requests提交變量數據,就能實現翻頁。

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

核心代碼如下:

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)


四.Python套接字通信


(一) 什麼是C/S架構呢?


Python網絡通訊主要是C/S架構的,採用套接字實現。C/S架構是客戶端(Client)和服務端(Server)架構,Server唯一的目的就是等待Client的請求,Client連上Server發送必要的數據,然後等待Server端完成請求的反饋。


C/S網絡編程:

Server端進行設置,首先創建一個通信端點,讓Server端能夠監聽請求,之後就進入等待和處理Client請求的無限循環中。Client編程相對Server端編程簡單,只要創建一個通信端點,建立到服務器的鏈接,就可以提出請求了。


(二) 什麼是套接字?


套接字是一種具有之前所說的“通信端點”概念的計算網絡數據結構,網絡化的應用程序在開始任何通信都必須創建套接字。相當於電話插口,沒它無法通信,這個比喻非常形象。Python支持:AF_UNIX、AF_NETLINK、AF_INET,其中AF_INET是基於網絡的套接字。


套接字起源於20世紀70年代加州伯克利分校版本的Unix,即BSD Unix,又稱為“伯克利套接字”或“BSD套接字”。最初套接字被設計用在同一臺主機上多個應用程序之間的通訊,這被稱為進程間通訊或IPC。


套接字分兩種:基於文件型和基於網絡的


第一個套接字家族為AF_UNIX,表示地址家族:UNIX。包括Python在內的大多數流行平臺上都使用術語“地址家族”及其縮寫AF。由於兩個進程都運行在同一臺機器上,而且這些套接字是基於文件的,所以它們的底層結構是由文件系統來支持的。可以理解為同一臺電腦上,文件系統確實是不同的進程都能進行訪問的。

第二個套接字家族為AF_INET,表示地址家族:Internet。還有一種地址家族AF_INET6被用於網際協議IPv6尋址。Python 2.5中加入了一種Linux套接字的支持:AF_NETLINK(無連接)套接字家族,讓用戶代碼與內核代碼之間的IPC可以使用標準BSD套接字接口,這種方法更為精巧和安全。

如果把套接字比作電話的查看——即通信的最底層結構,那主機與端口就相當於區號和電話號碼的一對組合。一個因特網地址由網絡通信必須的主機與端口組成。而且另一端一定要有人接聽才行,否則會提示“對不起,您撥打的電話是空號,請查詢後再撥”。同樣你也可能會遇到如“不能連接該服務器、服務器無法響應”等。合法的端口範圍是0~65535,其中小於1024端口號為系統保留端口。


(三) 面向連接與無連接


1.面向連接 TCP

通信之前一定要建立一條連接,這種通信方式也被成為“虛電路”或“流套接字”。面向連接的通信方式提供了順序的、可靠地、不會重複的數據傳輸,而且也不會被加上數據邊界。這意味著,每發送一份信息,可能會被拆分成多份,每份都會不多不少地正確到達目的地,然後重新按順序拼裝起來,傳給正等待的應用程序。


實現這種連接的主要協議就是傳輸控制協議TCP。要創建TCP套接字就得創建時指定套接字類型為SOCK_STREAM。TCP套接字這個類型表示它作為流套接字的特點。由於這些套接字使用網際協議IP來查找網絡中的主機,所以這樣形成的整個系統,一般會由這兩個協議(TCP和IP)組合描述,即TCP/IP。


2.無連接 UDP

無需建立連接就可以通訊。但此時,數據到達的順序、可靠性及不重複性就無法保障了。數據報會保留數據邊界,這就表示數據是整個發送的,不會像面向連接的協議先拆分成小塊。它就相當於郵政服務一樣,郵件和包裹不一定按照發送順序達到,有的甚至可能根本到達不到。而且網絡中的報文可能會重複發送。那麼這麼多缺點,為什麼還要使用它呢?由於面向連接套接字要提供一些保證,需要維護虛電路連接,這都是嚴重的額外負擔。數據報沒有這些負擔,所有它會更”便宜“,通常能提供更好的性能,更適合某些場合,如現場直播要求的實時數據講究快等。


實現這種連接的主要協議是用戶數據報協議UDP。要創建UDP套接字就得創建時指定套接字類型為SOCK_DGRAM。這個名字源於datagram(數據報),這些套接字使用網際協議來查找網絡主機,整個系統叫UDP/IP。


(四) socket()模塊函數


使用socket模塊的socket()函數來創建套接字。語法如下:

socket(socket_family, socket_type, protocol=0)

其中socket_family不是AF_VNIX就是AF_INET,socket_type可以是SOCK_STREAM或者SOCK_DGRAM,protocol一般不填,默認值是0。


創建一個TCP/IP套接字的語法如下:

tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)


同樣創建一個UDP/IP套接字的語法如下:

udpSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)


由於socket模塊中有太多屬性,所以使用"from socket import *"語句,把socket模塊裡面的所有屬性都帶到命名空間中,大幅縮短代碼。調用如下:

tcpSock = socket(AF_INET, SOCK_STREAM)


下面是最常用的套接字對象方法:

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

提示:在運行網絡應用程序時,如果能夠使用在不同的電腦上運行服務器和客戶端最好不過,它能讓你更好理解通信過程,而更多的是方位localhost或127.0.0.1。

(五) TCP通信實例

1.服務器 tcpSerSock.py核心操作如下:

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

2.客戶端 tcpCliSock.py核心操作如下:

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

由於服務器被動地無限循環等待連接,所以需要先運行服務器,再開客戶端。又因為我的Python總會無法響應,所以採用cmd運行服務器Server程序,Python IDLE運行客戶端進行通信。運行結果如下圖所示:

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

如果出現錯誤[Error] Bad file descriptor表示服務器關閉客戶端連接了,刪除即可。建議:創建線程來處理客戶端請求。SocketServer模塊是一個基於socket模塊的高級別的套接字通信模塊,支持新的線程或進程中處理客戶端請求。同時建議在退出和調用服務器close()函數時使用try-except語句。


那麼,如何反彈shell程序呢?

使用 from subprocess import Popen, PIPE 導入庫,調用系統命令實現。核心代碼如下:

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)

Python攻防之基礎常識、正則表達式、Web編程和套接字通信(一)


五.總結


希望這篇文章對你有所幫助,這是Python網絡攻防非常基礎的一篇博客,後續作者也將繼續深入學習,製作一些常用的小工具供大家交流。最近CSDN博客排名正在改版,突然發現自己排到第6名,也談談我的看法。


每一位博主都值得尊重,每一篇博客都是我們的勞動果實。這一路走來,無數大佬、前輩讓CSDN發展壯大,包括算法的July大神、Android的郭霖和羅昇陽大神、圖像視頻的雷神、考入清北的兩位女大神、還有七八十歲的老一輩wzz老師,還有各個板塊的各種大神和前輩。就我而言,寫博客最早的初衷就是為了記錄當下,同時分享些知識給有用的讀者,現如今,每當看到一個“對我有幫助”的評論,看到一句“謝謝”仍然非常開心,覺得這篇文章值了。八年過來,中間也有段時間很看重排名,但寫著寫著就淡了,更期盼系統地撰寫些專欄,分享總結些互聯網上資料較少的技術。尤其是成為教師之後,更是品嚐到了分享知識的魅力和學生們的感恩,也鼓舞很多學生開始在CSDN撰寫了自己的博客。我所說的這一切也不意味著排名不重要,但更希望博友們能看淡些,真誠地總結好知識、分享好文章、幫助更多人,才是我們的初衷啊!而且CSDN也一直在進步,這些技術人員和工作人員一直在朝好的方向改進,這個排名算法也會陸續優化,感恩有你,感恩CSDN,一路同行!加油。


分享到:


相關文章: