| 作業描述 | 詳情 |
|---|---|
| 這個作業屬於哪個課程 | 2020未來網絡SDN實驗室納新營 |
| 這個作業要求在哪里 | 2020未來網絡SDN實驗室納新題 |
| 這個作業的目標 | 1.注冊博客園,並加入班級,可自行美化樣式,學習 Markdown 排版; 2.學習 Git,並創建自己的 Github 賬戶; 3.安裝配置 Ubuntu 虛擬機系統當作流量接收方; 4.tcpdump讀取外來流量,處理格式;程序讀取流量信息,並統計; 5.進一步從頻率或者報文長度或其他特征找出前K大或者超過閾值T的可疑流量,K值和閾值T由用戶設定,允許存在一定誤差。 |
| 作業正文 | 2020未來網絡SDN實驗室納新題題解 |
| 參考文獻 | VM虛擬機下載及安裝教程 VMware虛擬機所有版本永久許可證激活密鑰 Windows10下安裝Ubuntu18.04LTS詳細教程 Win10虛擬機VMware安裝Ubuntu 18.04.4詳細過程步驟 Tcpdump命令行網絡抓包工具 介紹 LinuxCast IT播客 tcpdump抓包分析 tcpdump使用指南 五元組 TCP/IP網絡模型 sketch簡介 Netflow 鏈接 |
自我介紹
- 姓名:羅佳昱
- 學號:031903146
- 班級:信息安全01班
- 性格:
- 跟熟人話賊多
- 熱衷於探索新事物
- 如果一群人的目光聚集在自己身上,會渾身不適,比如上台演講
- 對於自己想做的事願意付出自己全力
- 給自己的定義是任務驅動型的人,不作為任務布置的事情如果期間有其他事情出現,經常會拖延到必須要做時才會去做
- 自己覺得自己還是挺好相處的一個人,熱衷於古風歌曲
- 掌握的技術:目前已經學習過C語言和C++,正在學習算法與數據結構和自學Java。之前已經學習過Markdown語法和一些GitHub用法,並發布了博客,鏈接即為博客內容
作業鏈接
虛擬機 + ubuntu 安裝過程
虛擬機安裝
一、前往VMware官網地址(https://www.vmware.com/cn.html)
- 注意:沒有賬號必須先注冊才能下載
- 注冊頁面(https://my.vmware.com/cn/web/vmware/registration)

- 完成注冊后進入官網登入再進入下載區找到Workstation Pro

- 選擇適合的類型下載

二、虛擬機的安裝
- 打開下載好的exe文件,彈出安裝界面。

- 點擊下一步直到下圖位置,此時可以自行選擇安裝位置
注意:安裝路徑要用英文

- 接下來只要一直點下一步就可以了




三、獲取許可證秘鑰
- 打開虛擬機后會發現他需要許可證秘鑰

- 此時打開VMware虛擬機所有版本永久許可證激活密鑰自己選一個秘鑰輸進去就可以了

Ubuntu安裝
一、下載Ubuntu 18.04.5的鏡像文件
- 點擊下載ubuntu-18.04.5-destop-amd64.iso版本

二、打開虛擬機VMware,選擇“創建新虛擬機”

- 一直點擊下一步



- 這里可以設置安裝位置

- 這里設置處理器和內核個數

設置處理器和內核個數可以去任務管理器->性能看一下自己的機子情況(看內核和邏輯處理器)作出選擇

- 一直點擊下一步





- 下一步,選擇“將虛擬磁盤存儲位單個文件”

- 下一步

- 下一步

- 下一步去自定義硬件里面,選擇“新CD/DVD(SATA)”點擊“使用ISO映像文件”加入之前下載的Ubuntu鏡像文件后確認

三、打開已經創建的虛擬機安裝Ubuntu
- 出現以下頁面,選擇自己喜歡的語言后點擊安裝,然后接下來都是點繼續






- 設置用戶和密碼,寫自己記得住的就行,寫了”您的姓名”之后,“您的計算機名”和“選擇一個用戶名”會自動填好,不用改,然后可以選擇“自動登錄”,方便

- 開始安裝(這個會等的久一點,但也不會很久,大概二十分鍾左右)

- 點擊立即重啟

至此Ubuntu安裝完成,不過會不會覺得屏幕太小了?再安裝個VMware Tools吧
VMware Tools安裝
-
如圖點擊安裝,然后就可以看到圖里的桌面上的VMware Tools的光盤,點擊進入其中

-
進入后會看到一個壓縮文件 VMwareTools-10.3.22-15902021.tar.gz(中間的數字不同的虛擬機版本可能會不一樣),然后我們復制這個文件粘貼到我的主目錄下面(即home->個人用戶名的目錄下面)


-
解壓縮這個文件,按【Ctrl+Alt+T】調出終端命令界面,輸入命令【tar -zxvf VMwareTools-10.3.22-15902021.tar.gz】然后回車執行,解壓這個壓縮文件(可以在輸入【tar -zxvf VM】后按【Tab】鍵自動補全整個文件的名字)

-
解壓完成后,在原來的主目錄下會多出一個 vmware-tools-distrib 的文件夾;

-
接着輸入命令【cd vmware-tools-distrib】后回車進入這個文件夾(可以在輸入【cd vm】后按【Tab】鍵自動補全整個文件夾的名字),然后輸入命令【sudo ./vmware-install.pl】回車后輸入用戶密碼,然后看到選擇Yes/No的全部寫yes,其余全部按回車,就可以安裝完成了
-
出現下圖結果即為安裝成功

-
以下為屏幕變大效果

看着爽多了呢(▽)
tcpdump目前學習情況匯報
tcpdump 抓包過程和數據清洗過程
- 初始加了-n

- 加上-q -t

tcpdump的一些基本指令(更多詳見tcpdump使用指南)
Ctrl+c//停止抓包
- c//指定要抓取的包數量。注意,是最終要獲取這么多個包。例如,指定"-c 10"將獲取10個包,但可能已經處理了100個包,只不過只有10個包是滿足條件的包。
- i interface//指定tcpdump需要監聽的接口。若未指定該選項,將從系統接口列表中搜尋編號最小的已配置好的接口(不包括loopback接口,要抓取loopback接口使用tcpdump -i lo),一旦找到第一個符合條件的接口,搜尋馬上結束。可以使用'any'關鍵字表示所有網絡接口。
- n//對地址以數字方式顯式,否則顯式為主機名,也就是說-n選項不做主機名解析。
- nn//除了-n的作用外,還把端口顯示為數值,否則顯示端口服務名。
- N//不打印出host的域名部分。例如tcpdump將會打印'nic'而不是'nic.ddn.mil'。
- P//指定要抓取的包是流入還是流出的包。可以給定的值為"in"、"out"和"inout",默認為"inout"。
- s len//設置tcpdump的數據包抓取長度為len,如果不設置默認將會是65535字節。對於要抓取的數據包較大時,長度設置不夠可能會產生包截斷,若出現包截斷,
//輸出行中會出現"[|proto]"的標志(proto實際會顯示為協議名)。但是抓取len越長,包的處理時間越長,並且會減少tcpdump可緩存的數據包的數量,
//從而會導致數據包的丟失,所以在能抓取我們想要的包的前提下,抓取長度越小越好。
- w t.txt//將抓到的包的內容寫到t.txt文件夾內,此時看不見
- r t.txt//讀取存到t.txt的內容,只能用-r來讀取,直接打開是亂碼
- D//列出可用於抓包的接口。將會列出接口的數值編號和接口名,它們都可以用於"-i"后。
- F//從文件中讀取抓包的表達式。若使用該選項,則命令行中給定的其他表達式都將失效。
- e//輸出的每行中都將包括數據鏈路層頭部信息,例如源MAC和目標MAC。
- q//快速打印輸出。即打印很少的協議相關信息,從而輸出行都比較簡短。
- X//輸出包的頭部數據,會以16進制和ASCII兩種方式同時輸出。
- XX//輸出包的頭部數據,會以16進制和ASCII兩種方式同時輸出,更詳細。
- v//當分析和打印的時候,產生詳細的輸出。
- vv//產生比-v更詳細的輸出。
- vvv//產生比-vv更詳細的輸出。
tcpdump輸出內容分析
23:09:50.567344 IP 13.225.143.111.443 > 192.168.243.128.58042: Flags [P.], seq 1441:2881, ack 518, win 64240, length 1440
1.第一列:時分秒毫秒 23:09:50.567344
2.第二列:網絡協議 IP
3.第三列:發送方的IP地址+端口號,其中13.225.143.111是 IP,而443 是端口號
4.第四列:箭頭 >, 表示數據流向
5.第五列:接收方的IP地址+端口號,其中192.168.243.128是IP,而58042是端口號
6.第六列:冒號
7.第七列:數據包內容,包括Flags 標識符,seq 號,ack 號,win 窗口,數據長度 length,其中 [P.] 表示 PUSH 標志位為 1,更多標識符見下面
Flags 標識符
使用 tcpdump 抓包后,會遇到的 TCP 報文 Flags,有以下幾種:
[S] : SYN(開始連接)
[P] : PSH(推送數據)
[F] : FIN (結束連接)
[R] : RST(重置連接)
[.] : 沒有 Flag (意思是除上面四種類型外的其他情況,有可能是 ACK 也有可能是 URG)
學習到的一些概念
- 五元組
五元組是通信術語。通常是指源IP地址,源端口,目的IP地址,目的端口和傳輸層協議 - TCP/IP網絡模型
TCP/IP模型是互聯網的基礎,它是一系列網絡協議的總稱。這些協議可以划分為四層,分別為鏈路層、網絡層、傳輸層和應用層。 - 鏈路層:負責封裝和解封裝IP報文,發送和接受ARP/RARP報文等。
- 網絡層:負責路由以及把分組報文發送給目標網絡或主機。
- 傳輸層:負責對報文進行分組和重組,並以TCP或UDP協議格式封裝報文。
- 應用層:負責向用戶提供應用程序,比如HTTP、FTP、Telnet、DNS、SMTP等。
TCP/IP 中有兩個具有代表性的傳輸層協議----TCP 和 UDP。
- TCP
TCP協議全稱是傳輸控制協議是一種面向連接的、可靠的、基於字節流的傳輸層通信協議,由 IETF 的RFC 793定義。TCP 是面向連接的、可靠的流協議。流就是指不間斷的數據結構,你可以把它想象成排水管中的水流。 - UDP
UDP協議全稱是用戶數據報協議,在網絡中它與TCP協議一樣用於處理數據包,是一種無連接的協議。在OSI模型中,在第四層——傳輸層,處於IP協議的上一層。UDP有不提供數據包分組、組裝和不能對數據包進行排序的缺點,也就是說,當報文發送之后,是無法得知其是否安全完整到達的。
還有一些忘記及時存了,暫時先這些
尋找TOP-K
- 如果只用
tcpdump -i ens33 -t -q -n會發現有很多長度是0的包,而且好像都是用TCP協議的(還沒查為什么),如下圖

- 綜上我選擇處理長度大於0的且為UDP協議的包,於是用
tcpdump -i ens33 -n -t -q 'ip[2:2] > 0' and udp

代碼實現
本來想用哈希排序,搞了好幾天,無奈指針還是用的有點不清楚,報錯一直消不掉,只能先用計數排序做
代碼如下:
#include<iostream>
#include<stdlib.h>
#include<string>
#include<string.h>
using namespace std;
int main()
{
string str;
string s[1000][1000];//設置了s最多處理包長為1000,每種包長能存的包頂多1000個
int max=0;//記錄最大值,作為后面尋找前幾名的開始
int a[1000] = { 0 };
while (1)
{
char str1[100];
getline(cin, str);
if (str == "0")
break;
int k = 0,length=str.length();
for (int i = 0;; i++)
{
if (!(str[length - i-1] < 58 && str[length - i-1]>48))//從后往前找到第一個不是數字的字符后進入下面的循環
{
for (int j =length - i ; j < length; j++)//將數字字符存入新字符數組
{
str1[k] = str[j];
k++;
}
str1[k] = '\0';
break;
}
}
int c = atof(str1);//數字字符數組轉換為數字函數,返回值是double,我把它強制變成int
if (c > max)//最大值更新
max =c;
s[c][a[c]] = str;//存到對應的桶
a[c]++;//桶內元素個數更新
memset(str1, '0', sizeof(str1));//清空字符數組
str.clear();
}
int count = 0;//記錄已經找了前多少個元素
for (int i = 0;count<=10;i++ )
{
if (max - i > 0)
{
if (a[max - i] != 0)//不為零的才是有存元素的
{
for (int k = 0; k < a[max - i]; k++)
{
cout << s[max - i][k] << endl;
count++;
}
}
}
}
return 0;
}
尋找前十名結果(注:0之上為輸入數據,之下為結果):

遇到的問題以及解決
1.安裝VMware tools的時候,看的的那個教程Windows10下安裝Ubuntu18.04LTS詳細教程只講了開頭和結尾,再加上第一回裝上虛擬機有點興奮,在后面選擇的時候全部按回車,導致安裝失敗。再重裝VMware tools時提示有舊的安裝,又找不到vmware-uninstall-tools.pl,用網絡的教程不知道為什么失敗了。
解決方法:被迫重裝虛擬機再重裝VMware tools,認真做選項從而完成安裝
2.最初抓到的包都是下面這個樣子的

着實讓我很懵,這跟網絡上查的樣子完全不一樣,嘗試重裝虛擬機,重裝了兩次也沒有用
解決方法:解決的也挺突然,在一個個嘗試tcpdump的指令時,發現了
- n//對地址以數字方式顯式,否則顯式為主機名,也就是說-n選項不做主機名解析。
- nn//除了-n的作用外,還把端口顯示為數值,否則顯示端口服務名。
結果如下(這里還加了-q不顯示后面那一堆亂七八糟的東西)

3.一開始想着找top-k挺容易的,直接冒泡排序啥的就出來了,在知道要處理以萬為單位的包時,人就傻了
解決方法:本想用哈希排序,無奈被指針搞吐了,報錯消了好幾天還沒弄好,只能用計數排序先做,也導致能夠處理的包的數量大大受限,暫時這樣,如果哈希的代碼改出來了再補上
總結
雖然信安課業比較繁重,但是還是擠出了時間盡可能完成了作業,提前交作業的原因是接下來幾天要趕幾個ddl,擔心在忙亂中忘記交作業o(╥﹏╥)o。很快樂學習到了很多新概念,終於裝上了心心念念的虛擬機,很早就想裝不過老是拖延(任務驅動型實錘),比較遺憾沒能實現處理百萬數據的top-k的尋找。
覺得翻頁太麻煩可以直接點擊右邊的小飛機飛回頂部
