?? sendip.txt
字號:
Sendip使用說明
在從事網絡產品尤其是網絡安全產品開發時,我們一直面臨著一個問題,就是對產品的TCP/IP 協議棧進行穩定性或安全性測試,確保開發產品在遇到各種不規則的錯誤的IP 包時仍可正常穩定高效地工作,我們知道,在正常的網絡環境中,很難產生錯誤的IP 包,也很難產生我們想要的錯誤的IP 包,為此,要完成對產品的測試,我們必須自己來制造各種各樣錯誤的IP 包,本篇的目的就是介紹如何利用各種發包工具來制造自己想要的錯誤的IP 包。SENDIP 是一個LINUX 下的命令行工具,可以通過命令行參數的方式發送各種格式的IP 包,它有大量的命令行參數來規定各種協議的頭格式,目前可支持NTP, BGP, RIP, RIPng,TCP, UDP, ICMP 或raw IPv4 和IPv6 包格式,并且可以隨意在包中添加數據。
一、幫助文件說明
Usage: sendip [-v] [-d data] [-h] [-f datafile] [-p module] [module options] hostname
-d data add this data as a string to the end of the packet
Data can be:
rN to generate N random(ish) data bytes;
0x or 0X followed by hex digits;
0 followed by octal digits;
any other stream of bytes
-f datafile read packet data from file
-h print this message
-p module load the specified module (see below)
-v be verbose
參數含義:
-v: 詳細模式,即打印出你發送報文的內容,類似于debug模式,建議配置該參數,可以清楚的看到發送的報文內容是否正確。
-d: 添加data字段的內容,有option字段的話放在options字段之后,任意添加。也可以一次用文件導入,不過參數是下面的-f。
-h: 顯示上面的幫助文件。
-f: 在data字段添加參數后所指的文件里的內容,參數后跟的內容就是一個文件名。
-p: 指定發送報文的類型,選項就是幫助提示中的ipv4 ipv6 icmp tcp udp bgp rip ntp的8種類型,注意各個協議之間的搭配使用,例如ntp是用udp傳輸,而rip是用tcp傳輸。這個參數可以復用來更加精確的確定一個報文的類型和各個字段,例如:-p ipv4 –p tcp –p rip是可以一起用的。該參數必須配置。
hostname: 直接輸入ip地址即可,也可以是主機名,但是之前要把主機名和對應的ip寫入到/etc/hosts的文件中。該參數必須配置。注意不需要輸入hostname這個字段,要不是ip,要不是主機名。
配置完以上參數后就可以發送報文了,但是具體報文的各個字段都是default配置,并沒有達到自己要構造報文的目的。下面以ipv4、udp、tcp、icmp為例根據man文件的內容來說明各個字段的構造方法,ipv6、rip、bgp和ntp希望后面有時間再補充。
二、IPV4報文的構造
先看man文件中顯示支持可以構造的IPV4報文字段有哪些,然后在參數后直接說明該字段的含義。構造報文首先要求對報文的各個字段非常熟悉,所以先看一下IP首部的圖表:
IP首部:
0 15 16 31
4位版 本 首部長 度 8位
服務類型(TOS) 16位
總長度(字節)
16位
標識 3位標志 13位
片偏移
8位
生存時間TTL 8位
協議 16位
首部檢驗和
32位
源IP地址
32位
目的IP地址
32位
選項(若有)
數據
sendip_表1
上面是一個簡單的圖示,具體各個字段可以參見高文宇的《IP協議》文檔。
Arguments for module ./ipv4.so:
-is x Source IP address (see README)
構造源IP地址,任意構造。判斷不是很嚴格,可以輸入錯誤,它會自動補充或用255.255.255.255來代替,例如輸入1.1.則用255.255.255.255來代替;如果輸入1.1則會自動補齊中間的兩位,顯示為1.0.0.1;如果輸入1.1.1則會自動填充為1.1.0.1。目的IP地址也是一樣。源IP默認為127.0.0.1。
-id x Desitnation IP address
構造目的IP地址,這里其實可以不用寫,因為hostname為一個必帶的參數字段,最后的目的地址是匹配hostname參數后的內容。注意,這里的ip和hostname的內容要求一樣,不然sendip發出了報文(它發出的報文目的地址是-id參數后的地址),但是id和hostname所帶參數內容所指的主機的網卡并收不到報文。默認以-id后的參數為準。
-ih x IP header length (see README)
構造header(首部)長度,這里所指的是32-bit的word的個數,就是以4個字節為單位元,你定義的結果要乘以4,要求最小為5(5x4=20bytes),最大為15(15x4=60bytes)。如果構造首部不是20bytes的報文,網卡收到的時候ethereal只解析到mac地址,它不認為是一個完整的IP報文。默認是20字節。
-iv x IP version (you almost definately don’t want to change this)
構造IP版本,這個可以任意,0到15任意選擇,超過15發出的報文IP version為0。默認為4。
-iy x IP type of service
構造服務類型,這里先說明一下Type of service(PreDTRCx)的各個標志位的意義:
Precedence(000-111)
D(1 = minimize delay)
T(1 = maximize throughout)
R(1 = maximize reliability)
C(1 = minimize cost)
x(reservd and set to 0)
服務類型的前3位設置分組的優先級,數值越大,則分組越重要。接下來的3位分別表示延遲、吞吐率和可靠性,如果為0則表示常規服務,如果為1則表示短延遲、高吞吐率和高可靠性。最后兩位沒有使用。sendip并不能細致到定義每一個bit位的數值,默認是全0。
-il x Total IP packet length (see README)
構造IP報文的總長度,這里的總長度是包括數據字段的,就是說如果沒有數據字段,這里的值應該和首部長度字段的值是一樣的。最大值為65535(二進制16個1),但是注意配置這個值的意義不大,用ethereal抓到這個報文時顯示的值還是一個正確的值,這個報文本來有多大就是多大。默認是根據報文內容來確定,是一個正確的值。
-ii x IP packet ID (see README)
構造IP報文的標識號,這個時隨機的,沒有太多意義,不知道是不是會在校驗的時候用到。默認是隨機構造。在IP協議中的作用是標識報文,例如一個分片后的IP報文,它的ID肯定是一樣的。取值的范圍是1-65535,不在這個范圍的話,程序會隨機構造一個id號。
-ifr x IP reservced flag (see README)
保留的標志位。默認為0,選項為0、1、r。
-ifd x IP don’t fragment flag (see README)
構造強制不分片標志位,默認為0,選項為0、1、r。
-ifm x IP more fragments flag (see README)
構造分片標志位,這個標志位只有在報文需要分片時才置為1,默認為0,選項為0、1、r。
-if x IP fragment offset
構造需要分片的報文的位偏移,默認發送的報文沒有分片的話就是0。
-it x IP time to live
生存時間值,修改的意義不大,默認配置為255。
-ip x IP protocol
協議字段,判斷哪個協議使用了IP封裝來傳輸,例如ICMP為0x01,TCP為0x06,UDP為0x11。
-ic x IP checksum (see README)
構造首部校驗和字段,只覆蓋首部,不包括數據字段。默認是正確的校驗和,看不出什么規律來,應該是有一種算法。測試時可以隨意構造一個錯誤的checksum,看DUT是不是檢測checksum這個字段。但是驗證的過程中發現配置后沒有作用,并沒有修改。測試了icmp的包倒是修改了,不知道是不是軟件的bug。
注意:以下內容都是選項字段,之前沒有了解過的話,可能會覺得有些陌生,為了更好的了解這些字段的意思,可以先用ping這個簡單的命令來進行一些實踐操作,理解其中的一些字段的含義。
實例:
1、返回一個時戳,表示到達目的地址的時間,在reply的回應包中可以看到。
C:\>ping -s 1 192.168.100.18
Pinging 192.168.100.18 with 32 bytes of data:
Reply from 192.168.100.18: bytes=32 time<1ms TTL=63
Timestamp: 192.168.100.18 : 9612956
2、記錄路由,表示在ping包到達目的地址時經過的路由設備,需要設備的支持。
C:\>ping -r 1 192.168.100.18 -n 1
Pinging 192.168.100.18 with 32 bytes of data:
Reply from 192.168.100.18: bytes=32 time<1ms TTL=63
Route: 192.168.100.18
Ping statistics for 192.168.100.18:
-r表示記錄路由的跳數,注意這個參數值只能是1-9,原因是因為記錄路由這個選項需要3個字節的開銷,后面每跟一個ip地址需要4個字節,而選項字段的最大值為40個字節。這個參數的作用被之后的tracert命令代替。
-n 表示發多少個ping包。
3、嚴格源路由和記錄路由,表示不但要記錄路由,還要求到達目的地址必須要經過指定的路由地址。
C:\>ping -k 192.168.96.2 192.168.98.1 192.168.100.18
表示到達192.168.100.18時,先必須經過192.168.96.2和192.168.98.1這兩個路由設備,再到達目的ip。
現在逐一來看各個參數的含義:
-ionum x
根據《TCP/IP詳解》卷2第9章,并沒有這個選項字段,這里應該是軟件自己為了控制選項字段的長度而設計的。這里先說明一些選項字段的基礎知識:
l 選項字段必須是4字節的整數倍,原因很簡單,因為IP header length是以4字節為一個單位元;
l IP選項字段可能包含0個或多個單獨選項,選項有兩種類型,單字節和多字節,如下圖:
?/P>
sendip_圖1
所有選項1都以字節類型(type)字段開始。在多字段選項中,類型字段后面緊接著一個長度(len)字段,其它的字節是數據(data)。許多選項數據字段的第一個字節是1字節的位移(offset)字段,指向數據字段內的某個字節。長度(len)字節的計算覆蓋了類型、長度、和數據字段。類型(type)被繼續分成了3個子字段:1bit備份(copied)、2bit類(class)字段和5bit數字(number)字段。
現在來看各個選賢字段的定義和使用方法。默認這個參數后的長度值總是正確的,默認沒有選項字段。
-ioeol IP option: end of list
1字節,表示選項表的結尾,就是一個選項字段的結束標識符。
-ionop IP option: no-op
1字節,沒有任何意義,表示無操作,碰到這個字段可以忽略。
-iorr x
長度可變,作用是記錄路由。格式是pointer:addr1:addr2,這里的pointer其實就是一個具體的offset值,是一個十六進制的值,我測試最小值是十進制的10(這里只能用十進制表示,10剛好對應的是0x16)。使用可以參照這個命令行:
[root@FC5 ~]# sendip -v -p ipv4 -is 192.168.96.111 -id 192.168.96.202 -iorr 10:192.168.96.1 192.168.96.202 -d asf
這里要說明一點為什么要加一個asf的3個字節的數據字段,因為在測試的時候,我在被發送報文的pc端抓包發現如果ethereal分析顯示total length這個值不對的話,它就不會分析其它字段,這樣會導致不能清楚看到option字段,不知道是不是正確構造了報文,所以在構造報文時還需要注意這個小竅門,ethereal分析后還少幾個字節就加幾個字符。這樣你就可以看到你剛才發送的option字段里的內容了。
-iots x
長度可變,作用是時戳。格式是pointer:overflow:flag:(ip1:)ts1:(ip2:)ts2,pointer表示位偏移,overflow表示??,flag是標識位(0表示記錄時間戳、1表示記錄地址和時間戳、3表示只在預先指定的系統記錄時間戳,其它保留)。注意只有flag位置1時才有ip1、ip2的參數。
[root@FC5 ~]# sendip -v -p ipv4 -is 192.168.96.222 -iots 11:4:1:192.168.96.1:11:
192.168.9.8:90 192.168.96.202
11是位偏移,4表示??,1表示記錄地址和時間戳,后面就是一個ip對應一個時間戳。
構造這樣的報文主要可以用于測試DUT是不是檢查option字段,如果檢查,是不是檢查時間戳等信息。
-iolsr x
長度可變,表示寬松源路由和記錄路由(LSRR)。格式很簡單了,上面ping的實例如果運行后抓包看過以后,就發現這個是按照標準的格式來定義的。
[root@FC5 ~]# sendip -v -p ipv4 -is 192.168.96.253 -iolsr 10:192.168.96.1 192.168.96.202 -d 1
-iosid x
4個字節,構造identifier(標識符),取值范圍0-65535,超過該范圍自動變為0。我測試的結果顯示前2個字節總是0x8804,后面2個字節就是輸入的參數值。
-iossr x
長度可變,表示嚴格源路由和記錄路由(SSRR),格式同-iolsr。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -