題記

  • hackerA hacker is any highly skilled computer expert.
  • script kiddieA script kiddie is an unskilled individual who uses scripts or programs developed by others to attach computer systems and networks and deface websites

ping命令

ping 這個名字來源於航海的聲納定位操作。其操作類似於聲納定位。只不過在網路里發送的是ICMP數據包而不是聲波。該命令的目的是用於確定 某個主機 是否可達,距離 當前主機 多遠

   其實,我們2臺網路設備互ping,是有兩種case的。

  1. 同一網段

  如上圖,主機A,來ping主機B,那麼主機A,就要封裝 二層報文 ,他會先查自己的MAC地址表,如果沒有B的MAC地址,就會向外發送一個ARP廣播包【在之前的網路篇已經講的很清楚了,這裡不再囉嗦】。  

  交換機會收到這個報文後,交換機有學習MAC地址的功能,所以他會檢索自己有沒有保存主機BMAC。  

  如果有,就返回給主機A,如果沒有,就會向所有埠發送ARP廣播,其它主機收到後,發現不是在找自己,就紛紛丟棄了該報文,不去理會。  

  直到主機B收到了報文後,就立即相應,我的MAC地址是多少,同時學到主機AMAC地址,並按同樣的ARP報文格式返回給主機A,如圖:

 這時候主機A學到了主機BMAC,就把這個MAC封裝到ICMP協議的二層報文中向主機B發送,報文格式如下:

目的地址源地址源IP目的IPICMP報文00-50-56-C0-00-0300-50-56-C0-00-011.1.1.11.1.1.3Echo request

  當主機B收到了這個報文後,發現是主機AICPM回顯請求,就按 同樣 的格式,返回一個值給主機A,這樣就完成了 同一網段內ping過程~~

目的地址源地址源IP目的IPICMP報文00-50-56-C0-00-0100-50-56-C0-00-031.1.1.31.1.1.1Echo answer

  而實際上,我囉嗦了這麼久的的區域網內的PING,實際過程的發生不到 1毫秒~~

  1. 不同網段  

  主機Aping主機C,那麼主機A發現主機CIP和自己 不是 同一網段。

  主機A就去找 網關 轉發,但是他也不知道網關的MAC情況下呢?  

  他就會向之前那個步驟一樣先發送一個ARP廣播,學到網關的MAC,再發封裝ICMP報文給 網關路由器

  報文格式如下:  

目的地址源地址源IP目的IPICMP報文00-50-56-C0-00-0200-50-56-C0-00-011.1.1.12.1.1.3Echo request

  當 路由器 收到主機A發過來的ICMP報文。

  發現自己的目的地址是其本身MAC地址,根據目的的IP2.1.1.1,查 路由表,發現2.1.1.1/24的路由表項。

  得到一個 出口指針,去掉原來的MAC頭部.加上自己的MAC地址向主機C轉發…

  如果網關也沒有主機CMAC地址,還是要向前面一個步驟一樣,ARP廣播一下即可相互學到….

  路由器2埠能學到主機CMAC,主機C也能學到路由器2埠的MAC..

  報文格式如下:

目的地址源地址源IP目的IPICMP報文00-50-56-C0-00-0500-50-56-C0-00-041.1.1.12.1.1.1Echo request

  最後,在主機C已學到路由器2MAC,路由器2埠轉發給路由器1埠。

  路由1埠學到主機AMAC的情況下,他們就不需要再做ARP解析,就將ICMP的回顯請求回復過來..

目的地址源地址源IP目的IPICMP報文00-50-56-C0-00-0400-50-56-C0-00-052.1.1.11.1.1.1Echo Answer

代碼篇

  既然已經明白了ping命令和ICMP的原理,那麼我們就可以用代碼來實現 自動化工具~~~

趙四.尼古拉斯基 曾經說過:不要重複造輪子

  那麼,我們來介紹一下Python處理網路協議網路層傳輸層鏈路層 的能手 scapy ,和 爬蟲框架 scrapy 表兄弟關係,開個玩笑~~
  • Scapy 介紹Scapy 是一個可以讓用戶 發送偵聽解析 並偽裝網路報文的Python 程序。這些功能可以用於製作 偵測掃描攻擊網路 的工具。
  • 安裝pip3 install scapy
  • API
  1. 建立一個數據包>>> a=IP(ttl=10)>>> a < IP ttl=10 |>>>> a.src 』127.0.0.1』>>> a.dst="192.168.1.1">>> a < IP ttl=10 dst=192.168.1.1 |>>>> a.src 』192.168.8.14』>>> del(a.ttl)>>> a < IP dst=192.168.1.1 |>>>> a.ttl64
  2. 堆加層次(網路5層模型)/操作符在兩層之間起到一個 組合 的作用。當使用該操作符時,下層 可以根據其 上層,使它的 一個多個 默認欄位被重載。

    (您仍可以賦予您想要的值)一個字元串也可以被用作原料層(raw layer)。

    >>> IP() <IP |>>>> IP()/TCP() <IP frag=0 proto=TCP |<TCP |>>>>> Ether()/IP()/TCP() <Ether type=0x800 |<IP frag=0 proto=TCP |<TCP |>>>>>> IP()/TCP()/"GET / HTTP/1.0

    "<IP frag=0 proto=TCP |<TCP |<Raw load=GET / HTTP/1.0

    |>>>>>> Ether()/IP()/IP()/UDP() <Ether type=0x800 |<IP frag=0 proto=IP |<IP frag=0 proto=UDP |<UDP |>>>>>>> IP(proto=55)/TCP() <IP frag=0 proto=55 |<TCP |>>

  3. 發送>>> a=Ether()/IP(dst="slashdot.org")/TCP()/"GET /index.html HTTP/1.0

    " >>> hexdump(a) 00 02 15 37 A2 44 00 AE F3 52 AA D1 08 00 45 00 ...7.D...R....E. 00 43 00 01 00 00 40 06 78 3C C0 A8 05 15 42 23 [email protected]<....B# FA 97 00 14 00 50 00 00 00 00 00 00 00 00 50 02 .....P........P. 20 00 BB 39 00 00 47 45 54 20 2F 69 6E 64 65 78 ..9..GET /index 2E 68 74 6D 6C 20 48 54 54 50 2F 31 2E 30 20 0A .html HTTP/1.0 . 0A . >>> b=str(a) >>> b x00x02x157xa2Dx00xaexf3Rxaaxd1x08x00Ex00x00Cx00x01x00x00@x06x<xc0 xa8x05x15B#xfax97x00x14x00Px00x00x00x00x00x00x00x00Px02 x00 xbb9x00x00GET /index.html HTTP/1.0

原理API都明白啦,是時候表演我們 真正的技術

1. 構建一個ICMP包
2. 發送並且接受目的主機的回應
3. 如果目的主機可達,已```3```為結束碼並退出進程

這個時候我們就可以通過Python構建了一個探測工具,判斷目的主機的網路連通性。

但僅僅如此還不夠智能,我們需要加入多進程掃描整個網路中的活動主機,所以:

  1. 通過要掃描的IP,計算出當前區域網的所有主機
  2. 多線程調用之前我們的探測工具,循環探測網路中的每個主機
  3. 講能夠連通的主機保存下來
  4. 為後面我們要做的事情做鋪墊

關注【mindev】,回復【ping】可以獲取單進程ping的源代碼,加入羣主星球即可獲取所有源代碼。

願意與大家分享交流各種技術,個人公眾賬號[mindev],以及 知識星球[ 極客世界]

    歡迎訂閱公眾賬號,日更喲~~~

推薦閱讀:

相關文章