『壹』 Netflix幕後最大功臣是Python!每個數據工具都靠Python構建
Netflix是全球最大的串流影音平台,如此多人追捧的趨勢下,又是哪種強大的程序語言,支撐著Netflix的內部運行呢?
而根據Netflix工程師在Netflix Tech Blog揭密,所使用程序語言便是目前最受歡迎的程序語言Python,運用該語言執行跟蹤用戶使用狀況與位置等,上到推薦演算法下到內容傳遞網路CDN,整個內容生命周期全都使用Python確保網路傳輸內容,絕圓拉進與用戶的距離。
Netflix工程師還佛心分享,Netflix是如何應用Python,截取出以下幾點:
Python加速警報和統計分析工作
CORE團隊將Python使用於警報和統計分析工作中,所以當警報系統亮紅燈時,就會自動分析1000多個相關信號,找出問題。另外Netflix也另外開發系統,使用Python進行大量的分析公作,以快速交付結果。總而言之,Python通常被Netflix用來自動化任務、數據采擷和清理。
Python設計Demand Engineering
Demand Engineering負責Netflix雲計算計算的區域容錯轉移、流量分配、容量運營和集群效率。而關於這部分Netfli x工程師十分自豪的表絕敏示,這些工具主要都是由Python構建的。編排容錯轉移的服務使用numpy和scipy來執行數值分析,boto3對AWS基礎設施進行更改,rq用於運行非同步工作負載,我們將其打包在並宏塌一個Flask API的薄層中。放入bpython shell並進行臨時製作的能力已經不止一次挽救了局面。
利用Python來設計個性化演算法
Netflix在個性化機器學習基礎設施中,廣泛使用Python來訓練一些關鍵體驗的機器學習模型:先是從推薦演算法到圖片個性化,再到營銷演算法。
例如,一些演算法使用TensorFlow、Keras和PyTorch來學習深度神經網路,XGBoost和LightGBM來學習梯度提升決策樹,或者Python中更廣泛的科學堆棧(numpy、scipy、sklearn、matplotlib、pandas、cvxpy等等)。
Python打造信息安全防路網
信息安全方面使用Python為Netflix實現安全自動化、風險分類、自動修復和漏洞識別等目標。並擁有許多成功的Python開源項目,包括Security Monkey(Netflix最活躍的開源項目)。基礎設施安全上也利用Python幫助使用Repokid進行IAM許可權調整,和幫助Lemur生成。
Python開發內容機器學習,預測收視率
內容機器學習也利用Python開發機器學習模型,來預測所有內容的受眾規模、收視率和其他需求指標的核心。
『貳』 用python,django做網路,安全性如何,安全性好嗎
所謂的安全性主要還是看數據傳送方式吧,無論什麼框架,安全性都是基於數據傳送時的可靠性,所以還是看你自己用的方式了。
『叄』 用python寫一個有關網路安全小程序
原理是監控埠的形式,持續進行telnet判斷,若埠無法連接說明網路出現異常,則進行列印到本地文件
『肆』 python這么簡單,只學這一個能有好的發展嗎
當然可以,Python是一門高級的編程語言,語法清晰、容易入門、簡單易懂,對初學者友好。學習Python之後可以從事的崗位有很多,包含:人工智升銷能滲攔、Web開發、游戲開發、數據分析、自動化運維、爬蟲等領域。叢笑胡
『伍』 風變編程的Python課程學完效果如何
一、Python簡介
Python是一種用來編寫應用程序的高級程序設計語言,TIOBE程序語言排行榜2015年12月的排名如下:
Python實現強勢逆襲,而且我相信,隨著時間的推移,國內Python語言未來前景也是一片向好。
Python的特點是優雅簡單,易學易用(雖然我感覺還是有一些概念不容易理解),Python的哲學是盡量用最少的,最簡單易懂的代碼實現需要的功能。Python適宜於開發網路應用,腳本寫作,日常簡單小工具等等。Python的缺點是效率較低,但是在大量的場合效率卻不是那麼重要或者說Python不是其性能瓶頸,所以不要太在意。其次是2.x-3.x的過渡使得許多3.x還缺少很多2.x下的模塊,不過也在完善中。其次就是源代碼無法加密,發布Python程序其實就是發布源代碼。
二、基礎語法要點
1.如果一個字元串中有許多需要轉義的字元,而又不想寫那麼多'',那麼可以用 r'...' 表示 '...'內的內容不轉義掘巧。
2.Python可用'''...'''來表示多行內容,如:
123456>>>print('''line1line2line3''')line1line2line3
3.Python的邏輯運算and, or, not 分別對應C語言中的&&, ||, !.
4.Python的整數與浮點數大小都沒有范圍。
5.Python中除法有兩種: '/'廳陸除出來必是浮點數, '//'除出來是整數,即地板除。
6.Python中一切皆引用。每個對象都有一個引用計數器(內部跟蹤變數)進行跟蹤,引用計數值表示該對象有多少個引用,當初次產生賦給變數時,引用計數為1,其後沒進行下列行為中的任意一種都會增加引用計數:
123賦值: a=b用作函數參數傳遞: func(a)成為容器對象的一個元素: lis=[1,2,a]
以下任意一種行為都會減少引用計數:
1234del銷毀:dela變數另賦給其他對象:a=False對象從容器中刪除: lis.remove(a)身在的容器被銷毀:dellis
7.深拷貝與淺拷貝的概念與對比,有點復雜,看這篇文章
8.list,tuple和dict,set
list:為列表,是一個有序集合,類似於數組但又比數組功能強大,可以隨時append,pop元素,下標從0開始,且下標為加n模n制,即lis[-1] = lis[len-1],下標范圍[-len,len-1].
tuple:為元組,類似於list,但list為可變類型,而tuple不可變,即沒判伏鍵有append,pop等函數。一個建議是為了安全起見,能用tuple代替list盡量用tuple。如果tuple只有一個元素,要寫成如(1,)以避免歧義。
dict:字典類型,存放key-value鍵值對,可以根據key迅速地找出value,當然,key必須是不可變類型,如下是錯誤的:
12345>>> dic={[1,2]:'value'}Traceback (most recent call last):File"<pyshell#10>", line1,in<mole>dic={[1,2]:'value'}TypeError: unhashabletype:'list'
list與dict的優劣對比:
1234567dict:1.插入,查找速度快,跟key的數目無關2.需佔用大量內存,內存浪費嚴重list:1.插入,查找速度慢,O(n)的復雜度,隨元素個數增加而增加2.佔用內存小
dict內部存放的順序和key放入的順序是沒有關系的
set:set與dict類似,相當於只有key沒有value的dict,每個key不同,set間有 &, | 等操作對應集合的交,並操作。
三、函數
1.函數是對象,函數名即是指向對應函數對象的引用,所以可以將函數名賦給一個變數,相當於給函數起一個『別名』。
123>>> mmm=max>>> mmm(1,2,3)3
2.Python函數可以返回」多個值「,之所以打引號,是因為實際上返回的多個值拼成了一個元組,返回這個元組。
3.定義默認參數需要牢記:默認參數必須指向不變對象。否則第一次調用和第二次調用結果會不一樣,因為可變的默認參數調用後改變了。
4.可變參數:傳入的參數個數是可變的,可以是0個或多個。可變參數會將你傳入的參數自動組裝為一個tuple。在你傳入的list或tuple名字前加一個 * 即說明傳入的是可變參數。習慣寫法為*args。
5.關鍵字參數:傳入0個或多個含參數名的參數,這些參數被自動組裝成一個dict。習慣寫法**kw,如**a表示把a中所有的鍵值對以關鍵字參數的形式傳入kw,獲得一個dict,這個dict是a的一份拷貝,對kw改動不會傳遞到a
6.命名關鍵字在函數定義中跟在一個*分割符後,如
12deffunc(a,b,*,c,d):pass
c,d為命名關鍵字參數,可以限制調用者可以傳入的參數名,同時可以提供默認值。
7.參數定義順序:必選參數,默認參數,可變參數/命名關鍵字參數,關鍵字參數。
8.切片操作格式為lis[首下標:尾下標:間隔],如果都不填,即lis[::]則代表整個容器lis
9.用圓括弧()括起來一個列表生成式創建一個生成器generator,generator保存生成演算法,我們可以用next(g)取得生成器g的下一個返回值。生成器的好處就是我們不需要提前生成所有列表元素,而是需要時再生成,這在某些情況下可以節省許多內存。演算法也可以不是列表生成式而是自定義函數,只需在函數定義中包含yield關鍵字。
10.map()和rece(): 二者都是高階函數。map()接收兩個參數,一個是函數,一個是Iterable序列,map將傳入的函數依次作用在序列每一個元素上,並把結果作為新的Iterator返回。rece()類似累積計算版的map(),把一個函數作用在一個序列上,每次接收兩個參數,將結果繼續與序列的下一個元素做累積計算。
利用map和rece編寫一個str2float函數,如把字元串'123.456'轉換成浮點數123.456:
123456789101112131415(s):deff1(x,y):returnx*10+ydefchar2num(s):return{'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}[s]deff2(x,y):returnx*0.1+ya,b=s.split('.')print('a=',a)print('b=',b)returnrece(f1,map(char2num,a))+0.1*rece(f2,map(char2num,b[::-1]))print('str2float('123.456') =', str2float('123.456'))
11.fliter()函數過濾序列,類似於map()作用於每一元素,根據返回值是True或者False決定舍棄還是保留該元素。函數返回一個Iterator。
12.sorted()函數可實現排序,類似於C++庫中的sort()函數,但是比其更加簡潔,語法為sorted(lis,key=func,reverse=T/F)
key函數可實現自定義的排序規則,reverse表示升序還是降序。
13.一個函數可以返回一個函數,但是返回時該函數並未執行,所以返回函數中不要引用任何可能發生變化的變數,否則會出現邏輯錯誤。
14.裝飾器(decorator): 當需要增強函數的功能卻不希望修改函數本身,那麼可以採用裝飾器這種運行時動態增加功能的方式,增加的功能卸載裝飾器函數中。如在執行前後列印'begin call'和'end call',可以這樣做:
12345678910111213141516importfunctoolsdeflog(func):@functools.wraps(func)#為了校正函數簽名,最好寫上defwrapper(*args,**kw):print('begin call')f=func(*args,**kw)print('end call')returnfreturnwrapper@logdefhah():print('hahahaha')hah()
123
begin callhahahahaend call
15.偏函數: functools.partial(),作用是將一個函數的某些參數固定住,作為新函數的參數,即固定住該參數,返回一個新函數,使調用更簡單。
四、面向對象編程
1.Python實例變數可以自由地綁定任何屬性
2.為了不讓內部屬性不被外部訪問,在屬性的名稱前加上兩個下劃線__,這樣就變成了一個私有變數(private),注意,不能直接訪問不代表一定不能訪問,事實上,加雙下劃線後Python就會將其改名為『_class名__name』,所以還是可以這樣來訪問這個『私有』變數。
3.對於靜態語言,如果要求傳入一個class類型的對象,那麼傳入的對象必須是class類型或者其子類,否則將無法調用class中的方法,而Python這樣的動態語言有『鴨子類型』一說,即不一定要傳入class類型或其子類,而只要保證傳入的對象中有要使用的方法即可。
4.如果想要限制實例可以綁定的屬性,那麼在定義class時定義一個__slots__變數即可,例如:
12classStudent(object):__slots__=(『name』,』age』)
注意,__slots__限制的屬性對當前類實例起完全限製作用,且與子類共同定義其__slots__,也就是說子類可以定義自己的__slots__,子類實例允許定義的屬性就是自身的__slots__加上父類的__slots__,即並集。
5.@ property裝飾器可以使一個getter方法變成屬性,如果方法名為me,那麼@me.setter裝飾器則可使一個setter方法變成屬性。這樣可以使代碼更簡短,同時可對參數進行必要的檢查。
6.通過多重繼承,可使子類擁有多個父類的所有功能。
7.在類中__call__方法可使實例對象像函數那樣直接調用,作用即是該方法定義的過程。
8.ORM(Object Relational Mapping 對象關系映射),就是把關系資料庫的一行映射為一個對象,也就是一個類對應一個表。ORM的實現需要通過metaclass元類修改類的定義。元類可以改變類創建時的行為。
五、調試
1.Python調試方法:
(1)直接列印
(2)斷言
(3)pdb
(4)IDE
六、IO編程
1.序列化: 把變數從內存中變成可存儲或傳輸的過程稱之為序列化。Python用pickle模塊實現序列化。序列化之後,就可以把序列化後的內容存儲到磁碟上或者通過網路進行傳輸。pickle.mps()將對象序列化成一個bytes,而pickle.loads()可以根據bytes反序列化出對象。
2.pickle雖好,但是它專為Python而生,所以要在不同語言間傳遞對象,最好還是xml或者json,而json表示格式是一個字元串,更易讀取,且比xml快,所以更加適宜於對象序列化。Python內置了json模塊,相應方法仍然是mps()和loads()。
3.但是在默認情況下,有些對象是無法序列化的,所以我們有時還需要定製轉換方法,告訴json該如何將某類對象轉換成可序列為json格式的{}對象。如下即是一個轉換方法:
123456defmantodict(std):return{'name': std.name,'age': std.age,'id': std.id}
七、進程與線程
1.Python用mutiprocessing模塊來實現多進程。
2.如果要大量創建子進程,可以使用進程池:
1frommultiprocessingimportPool
示例如下:
12345678....p=Pool(4)foriinrange(5):p.apply_async(long_time_task, args=(i,))print('Waiting for all subprocesses done...')p.close()p.join()print('All subprocesses done.')
要使用進程池需新建Pool對象,對Pool對象調用join()使等待池中所有子進程運行完畢,調用join()方法之前必須調用close(),且此後無法再新加子進程。
3.使用subprocess模塊可以方便的啟動並管理一個子進程,控制其輸入輸出。
4.進程間通信使用Queue,Pipes實現。
5.threading模塊管理線程。threading.lock()創建線程鎖,防止同時訪問互斥資源造成的錯誤,示例如下:
1234567lock=threading.Lock()...lock.acquire()...change(mutex)...lock.release()
6.ThreadLocal可以解決參數在一個線程中各個函數之間互相傳遞的問題。
7.managers模塊實現分布式進程。
八、正則表達式與常用內建模塊
1.re模塊進行正則表達式編譯和匹配,如果該表達式需要匹配很多次,那麼最好進行編譯從而大大節省時間。
正則表達式匹配郵箱例子:
12345678910importrehah=re.compile('[0-9a-zA-Z]+[.[0-9a-zA-Z]+]*@[0-9a-zA-Z]+.[a-z]{2,3}')print(hah.match('[email protected]').group())print(hah.match('[email protected]').group())i=1whilei <10:r=input('請輸入郵箱:')print(hah.match(r).group())i=i+1
2.datetime模塊進行日期和時間的處理,每一個時間對應一個timestamp,我們把1970年1月1日 00:00:00 UTC+00:00時區的時刻稱為epoch time,記為0(1970年以前的時間timestamp為負數),當前時間就是相對於epoch time的秒數,稱為timestamp。字元串和datetime也可以相互轉換,採用strptime()方法,字元串轉換為datetime時需要設定一個識別格式,其中
1%Y-%m-%d%H:%M:%S
分別表示年-月-日 時-分-秒。
從datetime得出月份,星期等字元串用strftime()方法,其中:
1%a,%b%d%H:%M
分別表示星期, 月份 日期 時:分。
示例:
12345678910fromdatetimeimportdatetimer='2015-11-23 12:01'dt=datetime.strptime(r,'%Y-%m-%d %H:%M')print(dt)week=dt.strftime('%a %b %d, %H:%M')print(week)2015-11-2312:01:00Mon Nov23,12:01
3.collections是Python內建的一個集合模塊,提供了許多有用的集合類。
4.Base64是一種任意二進制到文本字元串的編碼方法,常用於在URL、Cookie、網頁中傳輸少量二進制數據。
5.struct模塊用來解決bytes和其他二進制數據類型的轉換。
6.Python的hashlib提供了常見的哈希演算法,如MD5,SHA1等等。hashlib實現簡單登錄:
importhashlibdb={'michael':'','bob':'','alice':''}defget_md5(ostr):md5=hashlib.md5()md5.update(ostr.encode())returnmd5.hexdigest()deflogin(user, password):r=get_md5(password)fornameindb:ifdb[name]==r:returnTruereturnFalseprint(login('bob','abc999'))True
7.Python的內建模塊itertools提供了非常有用的用於操作迭代對象的函數。
8.urllib提供了一系列用於操作URL的功能。如GET,POST...
9.PIL(Python Imaging Library Python圖像庫)是一個強大的圖像處理標准庫,功能強大卻又簡單易用。現在的名字叫做Pillow。可以如下安裝Pillow:
1pip3 install pillow
從下面生成數字驗證碼的程序可以窺其一斑:
九、網路編程和電子郵件
1.網路編程主要是TCP和UDP的編程,示例見【Python網路編程】利用Python進行TCP、UDP套接字編程
2.SMTP是發送郵件的協議,Python內置對SMTP的支持,可以發送純文本郵件、HTML郵件以及帶附件的郵件。Python對SMTP支持有smtplib和email兩個模塊,email負責構造郵件,smtplib負責發送郵件。Python內置一個poplib模塊,實現了POP3協議,可以直接用來收郵件。由於現在絕大多數大型郵件服務商都採取了反垃圾郵件措施,所以這部分的簡單實驗並沒有成功,還需進一步研究,等遇到具體情況再說。
3.Python內嵌了sqlite資料庫,還可以自行安裝連接mysql,MySQL是當前最流行的開源資料庫,在行業內有著廣泛的應用。
十、Web開發和非同步IO
1.WSGI(Web Server Gateway Interface) 伺服器網關介面。
2.Python web 開發框架:
-Flask:流行的Web框架
-Django:全能型Web框架
-web.py:一個小巧的Web框架
-Bottle:和Flask類似的Web框架
-Tornado:Facebook的開源非同步Web框架
3.協程
『陸』 Python網路編程 -- TCP/IP
首先放出一個 TCP/IP 的程序,這里是單線程伺服器與客戶端,在多線程一節會放上多線程的TCP/IP服務程序沖戚拍。
這里將服務端和客戶端放到同一個程序當中,方便對比服務端與客戶端的不同。
TCP/IP是網際網路的通信協議,其參考OSI模型,也採用了分層的方式,對每一層制定了相應的標准。
網際協議(IP)是為全世界通過互聯網連接的計算機賦予統一地址系統的機制,它使得數據包能夠從互聯網的一端發送至另一端,如 130.207.244.244,為了便於記憶,常用主機名代替IP地址,例如 .com。
UDP (User Datagram Protocol,用戶數據報協議) 解決了上述第一個問題,通過埠號來實現了多路復用(用不同的埠區分不同的應用程序)但是使用UDP協議的網路程序需要自己處理丟包、重包和包的亂序問題。
TCP (Transmission Control Protocol,傳輸控制協議) 解決了上述兩個問題,同樣使用埠號實現了復用。
TCP 實現可靠連接的方法:
socket通信模型及 TCP 通信過程如下兩張圖。
[圖片上傳失敗...(image-6d947d-1610703914730)]
[圖片上傳失敗...(image-30b472-1610703914730)]
socket.getaddrinfo(host, port, family, socktype, proto, flags)
返回: [(family, socktype, proto, cannonname, sockaddr), ] 由元組組成的列表散羨。
family:表示socket使用的協議簇, AF_UNIX : 1, AF_INET: 2, AF_INET6 : 10。 0 表示不指定。
socktype: socket 的類型, SOCK_STREAM : 1, SOCK_DGRAM : 2, SOCK_RAW : 3
proto: 協議, 套接字所用的協議,如果不指定, 則為 0。 IPPROTO_TCP : 6, IPPRTOTO_UDP : 17
flags:標記,限制返回內容。 AI_ADDRCONFIG 把計算機無法連接的所有地址都過濾掉(如果一個機構既有IPv4,又有IPv6,而主機只有IPv4,則會把 IPv6過濾掉)
AI _V4MAPPED, 如果本機只有IPv6,服務卻只有IPv4,這個標記會將 IPv4地址重新編碼為可實際使用的IPv6地址。
AI_CANONNAME,返回規范主機名:cannonname。
getaddrinfo(None, 'smtp', 0, socket.SOCK_STREAM, 0, socket.AP_PASSIVE)
getaddrinfo('ftp.kernel.org', 'ftp', 0, 'socket.SOCK_STREAM, 0, socket.AI_ADDRCONFIG | socket.AI_V4MAPPED)
利用已經通信的套接字名提供給getaddrinfo
mysock = server_sock.accept()
addr, port = mysock.getpeername()
getaddrinfo(addr, port, mysock.family, mysock.type, mysock.proto, socket.AI_CANONNAME)
TCP 數據發送模式:
由於 TCP 是發送流式數據,並且會自動分割發送的數據包,而仔槐且在 recv 的時候會阻塞進程,直到接收到數據為止,因此會出現死鎖現象,及通信雙方都在等待接收數據導致無法響應,或者都在發送數據導致緩存區溢出。所以就有了封幀(framing)的問題,即如何分割消息,使得接收方能夠識別消息的開始與結束。
關於封幀,需要考慮的問題是, 接收方何時最終停止調用recv才是安全的?整個消息或數據何時才能完整無缺的傳達?何時才能將接收到的消息作為一個整體來解析或處理。
適用UDP的場景:
由於TCP每次連接與斷開都需要有三次握手,若有大量連接,則會產生大量的開銷,在客戶端與伺服器之間不存在長時間連接的情況下,適用UDP更為合適,尤其是客戶端太多的時候。
第二種情況: 當丟包現象發生時,如果應用程序有比簡單地重傳數據聰明得多的方法的話,那麼就不適用TCP了。例如,如果正在進行音頻通話,如果有1s的數據由於丟包而丟失了,那麼只是簡單地不斷重新發送這1s的數據直至其成功傳達是無濟於事的。反之,客戶端應該從傳達的數據包中任意選擇一些組合成一段音頻(為了解決這一問題,一個智能的音頻協議會用前一段音頻的高度壓縮版本作為數據包的開始部分,同樣將其後繼音頻壓縮,作為數據包的結束部分),然後繼續進行後續操作,就好像沒有發生丟包一樣。如果使用TCP,那麼這是不可能的,因為TCP會固執地重傳丟失的信息,即使這些信息早已過時無用也不例外。UDP數據報通常是互聯網實時多媒體流的基礎。
參考資料:
『柒』 新手小白想學習滲透和網路安全,從哪裡入手
基礎到入門的學習路線
一、網路安全
網路基礎
網路概述
(行業背景+就業方向+課程體系結構)
Vmware
IP地址的概述與應用
DOS命令與批處理
Windows服務安全
用戶管理
破解系統用戶密碼
NTFS許可權
文件伺服器
DNS服務
DHCP服務
IIS服務
活動目錄
域控管理
組策略(一)
組策略(二)
安全策略
PKI與證書服務
windows安全基線
Windows server 2003安全配置基線
階段綜合項目一
乙太網交換與路由技術
回顧windows服務
OSI協議簇
交換機的基本原理與配置
IP包頭分析與靜態路由
分析ARP攻擊與欺騙
虛擬區域網VLAN
VTP
單臂路由與DHCP
子網劃分VLSM
高級網路技術
回顧
三層交換
ACL-1
ACL-2
網路地址轉換
動態路由協議RIP
ipsec VPN
VPN遠程訪問
網路安全基線
Cisco基礎網路設備安全配置基線
安全設備防護
防火牆原理及部署方式
防火牆高級配置
IDS
WAF
階段綜合項目二
二、服務安全
Linux安全運維
Linux操作系統介紹與安裝與目錄結構分析
Linux系統的基本操作與軟體安裝
Linux系統下用戶以及許可權管理
網路配置與日誌伺服器建立應急思路
建立php主頁解析以及主頁的訪問控制
Nginx服務都建立以及tomcat負載均衡
iptables包過濾與網路地址轉換
實用型腳本案例
階段綜合項目三
三、代碼安全
前端代碼安全
HTML語言
CSS盒子模型
JS概述與變數
JS數據類型
JS函數
程序的流程式控制制
條件判斷與等值判斷結構
循環結構
JS數組
資料庫安全
sqlserver
access
oracle
mysql
後台代碼安全
PHP基礎
PHP語法
PHP流程式控制制與數組
PHP代碼審計中常用函數
PHP操作mysql資料庫
PHP代碼審計(一)
PHP代碼審計(二)
Python安全應用
初識python上篇
初識python下篇
基礎進階與對象和數字
字元串列表和元祖
字典條件循環和標准輸入輸出
錯誤異常函數基礎
函數的高級應用和模塊
面向對象編程與組合及派生
正則表達式和爬蟲
socket套接字
四、滲透測試
滲透測試導論
滲透測試方法論
法律法規與道德
Web 工作機制
HTTP 協議
Cookie 與session
同源策略
情報收集
DNS
DNS 解析
IP 查詢
主機測探與埠掃描
網路漏洞掃描
Web 漏洞掃描
其他工具
口令破解
口令安全威脅
破解方式
windows 口令破解
Linux 口令破解
網路服務口令破解
在線密碼查詢網站
常見的漏洞攻防
SQL 注入基礎
四大基本手法
其他注入手法
SQLmap 的使用
XSS 漏洞概述
XSS 的分類
XSS的構造
XSS 的變形
Shellcode 的調用
XSS 通關挑戰
實戰:Session 劫持
PHP 代碼執行
OS 命令執行
文件上傳漏洞原理概述
WebShell 概述
文件上傳漏洞的危害
常見的漏洞攻防
PUT 方法上傳文件
.htaccess 攻擊
圖片木馬的製作
upload-labs 上傳挑戰
Web容器解析漏洞
開源編輯器上傳漏洞
開源CMS 上傳漏洞
PHP 中的文件包含語句
文件包含示例
漏洞原理及特點
Null 字元問題
文件包含漏洞的利用
業務安全概述
業務安全測試流程
業務數據安全
密碼找回安全
CSRF
SSRF
提權與後滲透
伺服器提權技術
隧道技術
緩沖區溢出原理
Metasploit Framework
前言
urllib2
SQL 注入POC 到EXP
定製EXP
案例:Oracle Weblogic CVE2017-10271 RCE
案例:JBoss AS 6.X 反序列化
五、項目實戰
漏洞復現
內網靶機實戰
內網攻防對抗
安全服務規范
安全眾測項目實戰
外網滲透測試實戰
六、安全素養
網路安全行業導論
網路安全崗位職責分析
網路安全法認知
網路安全認證
職業人素質
『捌』 Python網路編程6-使用Pysnmp實現簡單網管
簡單網路管理協議SNMP(Simple Network Management Protocol)用於網路設備的管理。SNMP作為廣泛應用於TCP/IP網路的網路管理標准協議,提供了統一的介面,從而實現了不同種類和廠商的網路設備之間的統一管理。
SNMP協議分為三個版本:SNMPv1、SNMPv2c和SNMPv3。
SNMP系統由網路管理系統NMS(Network Management System)、SNMP Agent、被管對象Management object和管理信息庫MIB(Management Information Base)四部分組成。
SNMP查詢是指NMS主動向SNMP Agent發送查詢請求,如圖1-3所示。SNMP Agent接收到查詢請求後,通過MIB表完成相應指令,並將結果反饋給NMS。SNMP查詢操作有三種:Get、GetNext和GetBulk。SNMPv1版本不支持GetBulk操作。
不同版本的SNMP查詢操作的工作原理基本一致,唯一的區別是SNMPv3版本增加了身份驗證和加密處理。下面以SNMPv2c版本的Get操作為例介紹SNMP查詢操作的工作原理。假定NMS想要獲取被管理設備MIB節點sysContact的值,使用可讀團體名為public,過程如下所示:
SNMP設置是指NMS主動鏈衡向SNMP Agent發送對設備進行Set操作的請求,如下圖示。SNMP Agent接收到Set請求後,通過MIB表完成相應指令,並將結果反饋給NMS。
不同版本的SNMP Set操作的工作原理基本一致,唯一的區別是SNMPv3版本增加了身份驗證和加密處理。下面以SNMPv3版本的Set操作為例介紹SNMP Set操作的工作原理。
假定NMS想要設置被管理設備MIB節點好碰sysName的值為HUAWEI,過程如下所示:
SNMPv1和SNMPv2c的Set操作報文格式如下圖所示。一般情況下,SNMPv3的Set操作信息是經過加密封裝在SNMP PDU中,其格式與SNMPv2c的Set操作報文格式一致。
SNMP Traps是指SNMP Agent主動將設備產生的告警或事件上報給NMS,以便網路管理員及時了解設備當前運行的狀態。
SNMP Agent上報SNMP Traps有兩種方式:Trap和Inform。SNMPv1版本不支持Inform。Trap和Inform的區別在於,SNMP Agent通過Inform向NMS發送告警或事件後,NMS需要回復InformResponse進行確認。
在Ensp中搭建網路環境,在R2上啟用SNMP作為SNMP agent,Linux主機作為NMS;為方便觀察SNMP報文格式,在R2使用SNMP的版本為v2c。
通過下面的Python腳本獲取R2的系統信息與當前的主機名
運行結果如下
在R2介面上抓包結果如下,Linux主機向R2的161埠發送SNMP get-request報文,可以看到SNMP使用的版本為v2c,設置的團體名為public,隨機生成了一個request-id,變數綁定列表(Variable bindings),即要查詢的OID,但Value為空;值得注意的是這些信息都是明文傳輸的,為了安全在實際環境中應使用SNMPv3。
通過下面的Python腳本獲取R2的介面信息。
運行結果如下:
在R2介面抓包結果如友喚談下,getBuikRequest相比get-request設置了一個max-repetitions欄位,表明最多執行get操作的次數。Variable bindings中請求的OID條目只有一條。
下面Python腳本用於設置R2的主機名為SNMPv2R2。
運行結果如下
在路由器上可以看到主機名有R2變為了SNMPv2R2。
get-response數據包內容與set-request中無異。
下面Python腳本用於接收,R2發送的Trap,並做簡單解析。
先運行該腳本,之後再R2上手動將一個介面shutdown,結果如下:
介面上抓包結果如下,此時團體名用的是public,data部分表明是trap。
由於Ensp中的通用路由器認證演算法只支持des56,而pysnmp不支持該演算法,因此使用AR路由器配置SNMPv3。
使用下面Python腳本發送snmpv3 get報文獲取設備系統信息。
抓包結果如下,首先發送get-resques進行SNMPv3認證請求,隨機生成一個msgID,認證模式為USM,msgflgs中Reportable置1要求對方發送report,其他為置0,表示不進行加密與鑒權;另外安全參數,認證參數、加密參數都為空,此時不攜帶get請求數據。
路由器給NMS回復report,msgID與resquest一致,Msgflgs中各位都置0,同時回復使用的安全引擎,認證與加密參數為空,不進行認證與加密,因此能看到data中的數據。
AR1收到請求後進行回復,數據包中msgflags標志位中除reportable外其他位都置1,表示不需要回復,同時進行加密與鑒權。同樣也可以看到認證用戶為testuser,認證參數與加密參數都有填充,data部分也是同樣加密。
參考:
什麼是SNMP - 華為 (huawei.com)
AR100-S V300R003 MIB參考 - 華為 (huawei.com)
SNMP library for Python — SNMP library for Python 4.4 documentation (pysnmp.readthedocs.io)