# 主題: 自己的Tool自己做! 進化吧腳本小子-Python&RobotFramework製作簡易Packet Sniffer(一)
###### tags: `Posts`
## Automation Why?
舉個例子,那時候我才大二升大三的暑假,才剛過了計概,我就去了某家伺服器公司,不是我現在這家,公司名稱就不說了齁,那時候主管交代我的第一個任務是,要我看著資料去測試某個軟體指令的功能能不能正確執行,我想說,這也太簡單,下下指令就搞定了,結果呢,那個資料上面就有多達500筆的指令,於是呢我就這樣花了一個多禮拜,每天就是在不斷的敲指令,然後呢,再把指令產生的結果呢,一筆一筆記錄在excel上,相信我這樣的事情你遇到一次就不會想做第二次了,除非你的目標就是成為一位專業的薪水小偷,在這個案例中呢我們可以來思考幾個問題
- **如果今天這個軟體推出了新版本怎麼辦?**
千萬不要以為軟體更新是幾年的事情喔,很多軟體可能幾天幾個禮拜就推出了新版本,可能只是修補個漏洞,或是新增一個功能,有可能只是改個沒意義的參數名稱就給你直接發布新版,照原本方式來測,我看你到65歲退休都測不完喔
- **如果你指令下錯或是excel key錯字怎麼辦?**
可能會想,我又不是笨蛋,這麼簡單的事我怎麼可能會錯,但是人就一定會犯錯喔,人不是機器,機器比我們聰明就讓他們來幫我們服務就好
- **你的報告有人要看嗎?**
我做出來的excel,真的就很陽春,上面就只有指令和結果,結果就是成功或失敗,兩種結果而已,那程式的執行你怎麼確定他有用正確的方式執行呢?大家都有修過計概,有時候Function寫不出來,會不會心中浮現直接給他print結果出來就好,當然喔現在都有助教會看你程式碼,怕大家互相抄來抄去,或是直接Google複製貼上,然後會問你寫程式的思路邏輯喔,好孩子不要模仿XDD,不要直接寫printㄛ回過來做個結論,我們做的報告,缺少了兩個關鍵要素
* 第一就是**易讀性**
我可以很快知道這整個測試的結果,總共多少筆測試,幾個測試成功,幾個測試失敗
* 第二就是**可靠性**,我不只要知道測試的結果如何,我還要知道測試內部跑的code,跑的內容是甚麼,如果測試失敗了,報告上面會顯示錯誤訊息告訴我確切在哪個位置發生了錯誤嗎?
話說回來如果你畢業之後考上研究所當上了助教,可以考慮用我們今天教的課程概念,試著去寫一個測試程式,也不用這樣開著pycharm或是dev c++,每個同學的程式都下指令去跑一遍,跑一遍之後在人工看一遍程式碼,可以做Automation去自動生產報告,直接告訴你程式碼哪裡有問題,想想資工系兩個班大概多少人齁,至少100個人起跳ㄛ,每個禮拜都來個Project,整天測這些作業碩士就畢業了,論文也不用寫了,
相信看到這麼多的問題,還有累到爆又沒有意義的測試,大家心裡清楚為甚麼要做自動化了吧,自動化只要一鍵搞定,不到5分鐘我就可以跟主管報告結果了,剛上班直接打卡下班,讚!!!
## 自動化應用在資安上帶來的好處
大家有聽過**腳本小子(script kiddie)** 這個名詞嗎?相信有些人聽過有些人沒聽過,根據wiki百科的解釋
> **腳本小子**(英語:**script kiddie**)是一個==貶義詞==,用來描述以「駭客」自居並沾沾自喜的初學者。腳本小子不像真正的駭客那樣發現系統漏洞,他們通常使用別人開發的程式來惡意破壞他人系統。通常的刻板印象為一位沒有專科經驗的少年,破壞無辜網站企圖使得他的朋友感到驚訝,因而稱之為腳本小子。
腳本小子常常從某些網站上複製指令碼代碼,然後到處貼上,卻並不一定明白它們的方法與原理。他們欽慕於駭客的能力與探索精神,但與駭客所不同的是,腳本小子通常只是對電腦系統有基礎了解與愛好,但並不注重程式語言、演算法和資料結構的研究,雖然這些對於真正的駭客來說是必須具備的素質。
看完了維基百科的解釋可能嘴到不少人哦,**腳本小子**和**專業駭客**的差別在哪?就在於腳本小子只會使用別人的工具。學習開發自己的工具有幾個優點
- **了解底層原理**
推薦大家去打靶機,[HacktheBox](https://www.hackthebox.com/)對於初學者有提供各式靶機還有教學,如果有在打靶機,當我們要去利用某個靶機上的漏洞,網路上有的教學就會直接教你用metasploit用內建的payload去打靶機,看到用metasploit打靶機的教學我都直接關掉不看的,打進去了沒錯,但完全學習不到任何漏洞利用的技術,在漏洞學習的過程中我是推薦盡量不要使用現成的腳本,等到未來了解原理之後為了快速地進行滲透再來用腳本工具會比較好。
自己動手寫程式呢,你如果能自己寫你一定會了解漏洞利用的流程和原理,不然你寫不出來XD
- **彈性**
各式各樣的工具都有提供固定的功能,他不是變形蟲或百變怪,你想要拿來怎麼改就怎麼改,隨便你想要甚麼功能都可以自己做,未來走開發路線擁有這樣的能力是很值得的,代表你能夠開發屬於你自己的產品,開發屬於自己的服務,那不只能為你的公司帶來價值,也可以為你帶來財富喔。
- **時效性**
很多時候滲透測試的流程是需要在短時間內完成的,像是網站登入驗證他們都會傳驗證碼給你,這些驗證碼通常在一分鐘內或一定時間就會失效,想想如果今天你拿到了驗證碼,你要繼續做些壞壞的事,你可能真的要用加藤鷹的神之手來key指令喔。
- **跨平台**
OS作業系統千百種喔,有Windows,有Linux,有MacOS,在不同的作業系統平台還有多到你數不清的版本,常常我們想要用什麼樣的工具,我們就上網去github,或是去stackoverflow,去拿人家寫好的東西下來用,結果通常都是無法使用的,而且Python的直譯器在各大平台上幾乎都能運作,跟你說一個小秘密,其實在大多數的Linux系統甚至是Mac OS,系統內幾乎都有內建Python,一般人電腦裡面不太可能會安裝像是netcat或是wireshark這些軟體,高價值的企業伺服器更是不會那麼笨把這樣高風險的軟體安裝上去讓你利用,如前所述,放心吧!一定有Python!除了Windows作業系統以外(搞排擠)
## Python Coding前置準備
- VM 虛擬機
- Linux系統安裝在虛擬機上 Ubuntu or KaliLinux
- 安裝vscode IDE整合開發環境,當然你夠猛也可以直接用記事本來寫程式碼
- 先到vscode官網下載Linux相對應的安裝包
- sudo dpkg -i code.......amd64.deb
## Python Packet Sniffer 模擬wireshark封包偵測
### 到底甚麼是Socket
如果有上過計網的大概了解知道我在說甚麼,沒有的話我再幫大家簡單複習加深印象
> Socket就是一個網路上的通訊端點,使用者或應用程式只要連接到Socket便可以和網路上任何一個通訊端點連線,透過Socket這個中間介面讓User我們不用管網路底層的架構,直接使用這個API來呼叫相關的system call
簡單來說Socket就是我們要與其他主機進行網路通訊的窗台!

`socket(family, type, proto)`
- **family表示使用的地址類型,像是ipv4或是ipv6,AF_INET,表示我們使用ipv4的地址協定AF_UNIX用在本機程序與程序間的傳輸,讓兩個程序共享一個檔案系統(file system)**
- **type表示封包數據格式,主要有SOCK_STREAM和SOCK_DGRAM和SOCK_RAW三種類型**
- **SOCK_STREAM : TCP客戶端**
- **SOCK_DGRAM : UDP客戶端**
- **SOCK_RAW : 可以處理ICMP、及IGMP等封包格式,若要偵測所有格式的封包類型可以使用**
- TCP和UDP這兩種傳輸層的通訊協定的差異,TCP是(connection-oriented)通訊前需要建立連線確保資料依順序無誤的傳送,建立連線就會有額外的負擔,UDP則是(connectionless)不需要先建立連線,不過就無法確保資料傳輸的完整
- **proto表示我們所要監聽的protocal,預設是0**
- 相關EthernetProtocol可以參考[Protocol Numbers](https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml)
- Host IP 為自己本機的IP,可以在Windows系統可以在命令提示字元下ipconfig指令查看,Linux作業系統則可以下ifconfig指令查看
`os.name == 'nt'`
表示判斷我的作業系統是否為Windows
如果是OS的話我們就使用預設的Protocol
如果是Linux系統的話,Linux系統會強制指定監聽偵測ICMP封包
以上我們用Linux的作業系統做示範,所以protocol在範例中會被設定成**IPPROTO_ICMP**
`sniffer = socket.socket(socket.AF, socket.SOCK_RAW, socket_protocol)`
`sniffer.bind((HOST,0) `
把socket綁定到本機,port設定為0由系統自由分配可以使用的port
```
sniffer.setsockopt(socket.IPPROTO_IP,socket.IP_HDRINCL, 1)
setsockopt(level,optname,value)
```
開啟IP_HDRINCL才能在我們接收到的封包添加IP Header
```
if os.name == 'nt':
sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)
```
判斷作業系統是否為Windows,如果是就把IOCTL(Input/Output Control)系統呼叫網卡驅動程式來啟用混雜模式
`print(sniffer.recvfrom(65565))`
讀了一個封包並且列印出封包內容,我們設定最大的buffer size 65565bytes,確保我們能夠接收到完整的packet data
```
if os.name == 'nt':
sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)
```
監聽封包後,如果我們的作業系統是Windows,要記得把混雜模式停用
到Terminal上執行我們剛剛寫的腳本
**注意:因為我們使用的是混雜模式在Linux需要root權限(在指令前加上sudo),而在Windows就需要administrator權限**
可以看到一開始甚麼也沒出現,當然阿還沒有發送封包阿
我們可以開另外一個Terminal,然後輸入ping nostarch.com
最後的結果

## RobotFrameWork介紹
- RobotFrameWork是一個開源的自動測試框架
- 使用關鍵字為主進行測試,優點是我們可以很直覺的了解整個測試流程,而不是去看那麼多的程式碼,所以讓學習的門檻降低
- 有許多內建的library可以使用,最有名的像是Selenium,常常在做爬蟲或做網頁測試上會使用到
- 提供HTML的report和log,簡單可以看到所有測試的流程與結果
還有許多其他的優點,這邊就講幾個比較重要的特點就好

## 作業時間
1. 試著在Windows和Linux上測試packetSniffer,ping看看不同網站
## REF:
- https://ithelp.ithome.com.tw/articles/10237705
- 黑帽Python給駭客與滲透測試者的Python開發指南
- https://beej-zhtw-gitbook.netdpi.net/
- https://jvns.ca/blog/2017/02/07/mtu/
- https://www.uv.mx/personal/angelperez/files/2018/10/sniffers_texto.pdf