用Scapy解析TTL欄位的值

2021-08-14 17:17:52 字數 2616 閱讀 5440

#!/usr/bin/python

#coding=utf-8

from scapy.all import *

import time

import optparse

# 為避免ipy庫中的ip類與scapy庫中的ip類衝突,重新命名為iptest類

from ipy import ip as iptest

ttlvalues = {}

thresh = 5

# 檢查資料報的ip層,提取出源ip和ttl欄位的值

def testttl(pkt):

try:

if pkt.haslayer(ip):

ipsrc = pkt.getlayer(ip).src

ttl = str(pkt.ttl)

#print "[+] pkt received from: " + ipsrc + " with ttl: " + ttl

checkttl(ipsrc, ttl)

except:

pass

def checkttl(ipsrc, ttl):

# 判斷是否是內網私有位址

if iptest(ipsrc).iptype() == 'private':

return

# 判斷是否出現過該源位址,若沒有則構建乙個發往源位址的icmp包,並記錄回應資料報中的ttl值

if not ttlvalues.has_key(ipsrc):

#icmp發現掃瞄

#pkt = sr1(ip(dst=ipsrc) / icmp(), retry=0, timeout=1, verbose=0)

pkt = sr1(ip(dst=ipsrc) / icmp() / "zhou")

print pkt

ttlvalues[ipsrc] = pkt.ttl

# 若兩個ttl值之差大於閾值,則認為是偽造的源位址

if abs(int(ttl) - int(ttlvalues[ipsrc])) > thresh:

print '\n[!] detected possible spoofed packet from: ' + ipsrc

print '[!] ttl: ' + ttl + ', actual ttl: ' + str(ttlvalues[ipsrc])

def main():

parser = optparse.optionparser("[*]usage python spoofcheckttl.py -i -t ")

parser.add_option('-i', dest='iface', type='string', help='specify network inte***ce')

parser.add_option('-t', dest='thresh', type='int', help='specify threshold count ')

(options, args) = parser.parse_args()

if options.iface == none:

conf.iface = 'eth0'

else:

conf.iface = options.iface

if options.thresh != none:

thresh = options.thresh

else:

thresh = 5

sniff(prn=testttl, store=0)

if __name__ == '__main__':

main()

重點說明一下,避免大家走一些彎路,這段**中最重要部分就是:

# 判斷是否出現過該源位址,若沒有則構建乙個發往源位址的icmp包,並記錄回應資料報中的ttl值   

if not ttlvalues.has_key(ipsrc):       

#icmp發現掃瞄       

#pkt = sr1(ip(dst=ipsrc) / icmp(), retry=0, timeout=1, verbose=0)       

pkt = sr1(ip(dst=ipsrc) / icmp() / "zhou")

ttlvalues[ipsrc] = pkt.ttl

其中原文中的

#pkt = sr1(ip(dst=ipsrc) / icmp(), retry=0, timeout=1, verbose=0)

我已注釋掉了,因為在除錯過過程,pkt結果一直是none,所我翻查了關於

scapy學習icmp報文資料,將**改為       

pkt = sr1(ip(dst=ipsrc) / icmp() / "zhou") 後,結果正常輸出。有興趣有朋友可以深入研究。

查詢mx的ttl值

dig nocmd com mx noall answer 舉個例子,像上面寫的那樣,gmail.com域的mx記錄的ttl值是300s,gmail.com域的管理員要求遠端伺服器快取它的mx記錄不能高於5分鐘,所以當你第一次查詢那個記錄 gmail.com的mx記錄 時,dig會告訴你乙個300的...

解析mysql不重複字段值求和

在使用mysql時,有時需要查詢出某個欄位不重複的記錄,雖然mysql提供有distinct這個關鍵字來過濾掉多餘的重覆記錄只保留一條,但往往只用它來返回不重覆記錄的條數,而不是用它來返回不重記錄www.cppcns.com的所有值。其原因是distinct只能返回它的目標字段,而無法返回其它字段,...

關於PING命令TTL值的理解

關於ttl值 ttl值是生存時間 time to live 的縮寫,ip包被路由器丟棄之前允許通過的最大網段數量。雖然意思是生存時間,但看這個解釋是不是有點讓人摸不清頭腦?好那麼我們可以看看ip資料報,這個ttl值到底是指什麼?結果我幹了一件事就是ping了www.baidu.com的網域名稱,我們...