2013年7月28日 星期日

終於實現心中願望 - 出書



很高興~ 不斷努力終於實現心中願望 - 出書
其實出書的目的有二件事,趨使我去實現, 一件是實現心中的出書夢想, 另一件則是感謝上帝讓我有動力去完成它..所以要將這份榮耀歸於祂!


http://www.topteam.cc/02-shop-detail.php?cid=&sid=&pid=418

http://www.books.com.tw/exep/prod/booksfile.php?item=0010594566





高性能雲端虛擬化平台:Citrix XenServer 

2011年2月18日 星期五

Web troubleshooting分析常用的命令

系統連接狀態
1.查看TCP連接狀態
netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn
netstat -n | awk '/^tcp/ {++S[$NF]};END {for(a in S) print a, S[a]}'
netstat -n | awk '/^tcp/ {++state[$NF]}; END {for(key in state) print key,"\t",state[key]}'
netstat -n | awk '/^tcp/ {++arr[$NF]};END {for(k in arr) print k,"\t",arr[k]}'
netstat -n |awk '/^tcp/ {print $NF}'|sort|uniq -c|sort -rn
netstat -ant | awk '{print $NF}' | grep -v '[a-z]' | sort | uniq -c

2.查看請求數前20個IP
netstat -anlp|grep 80|grep tcp|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -n20
netstat -ant |awk '/:80/{split($5,ip,":");++A[ip[1]]}END{for(i in A) print A[i],i}' |sort -rn|head -n20

3.用tcpdump嗅探80埠的存取前20幾名
tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr |head -20

4.查看前20名較多time_wait連接
netstat -n|grep TIME_WAIT|awk '{print $5}'|sort|uniq -c|sort -rn|head -n20

5.找查較多的SYN連接
netstat -an | grep SYN | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr | more

6.根據埠列進程
netstat -ntlp | grep 80 | awk '{print $7}' | cut -d/ -f1

網站日誌分析篇(Apache Log)
1.獲得存取前10位的ip位址
cat access.log|awk '{print $1}'|sort|uniq -c|sort -nr|head -10
cat access.log|awk '{counts[$(11)]+=1}; END {for(url in counts) print counts[url], url}'


2.存取次數最多前20名的檔案或頁面
cat access.log|awk '{print $11}'|sort|uniq -c|sort -nr|head -20

3.列出傳輸最大前20名的幾個exe檔案(分析下載站的時候常用)
cat access.log |awk '($7~/\.exe/){print $10 " " $1 " " $4 " " $7}'|sort -nr|head -20

4.列出輸出大於200000byte(約200kb)的exe檔以及對應檔案發生次數
cat access.log |awk '($10 > 200000 && $7~/\.exe/){print $7}'|sort -n|uniq -c|sort -nr|head -100

5.列出到用戶端最耗時的頁面
cat access.log |awk  '($7~/\.php/){print $NF " " $1 " " $4 " " $7}'|sort -nr|head -100

6.列出最最耗時的頁面(超過60秒的)的以及對應頁面發生次數
cat access.log |awk '($NF > 60 && $7~/\.php/){print $7}'|sort -n|uniq -c|sort -nr|head -100

7.列出傳輸時間超過 30 秒的檔案
cat access.log |awk '($NF > 30){print $7}'|sort -n|uniq -c|sort -nr|head -20

8.統計網站流量(G)
cat access.log |awk '{sum+=$10} END {print sum/1024/1024/1024}'

9.統計代碼404的連接
awk '($9 ~/404/)' access.log | awk '{print $9,$7}' | sort

10. 統計http status
cat access.log |awk '{counts[$(9)]+=1}; END {for(code in counts) print code, counts[code]}'
cat access.log |awk '{print $9}'|sort|uniq -c|sort -rn

11.查看是哪些蜘蛛在抓取內容
/usr/sbin/tcpdump -i eth0 -l -s 0 -w - dst port 80 | strings | grep -i user-agent | grep -i -E 'bot|crawler|slurp|spider'

12.統計各HTTP 狀態數
cat tmp.log | awk -F' ' '$9 == "400" || $9 == "408" || $9 == "499" || $9 == "500" || $9 =="502" || $9 =="504" {print $9}' | sort | uniq -c | more

13.過濾出訪問網站的IP
grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' access.log >ip.txt

網站日分析(Squid篇)
按域統計流量
zcat squid_access.log.tar.gz| awk '{print $10,$7}' |awk 'BEGIN{FS="[ /]"}{trfc[$4]+=$1}END{for(domain in trfc){printf "%s\t%d\n",domain,trfc[domain]}}'

查看資料庫執行的sql
/usr/sbin/tcpdump -i eth0 -s 0 -l -w - dst port 3306 | strings | egrep -i 'SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREATE|DROP|ALTER|CALL'

系統Debug分析篇
1.調試命令strace -p pid
2.跟蹤指定進程的PIDgdb -p pid

更多的請參考:
http://bbs.linuxtone.org/forum-14-1.html

計算網站併發數

Request Per Second + Simultaneous Browser connections + Thinking Time = Concurrent User 
其中
Concurrent User  表示網站併發用戶數
Request Per Second [RPS] 表示每秒請求數(輸送量)
Simultaneous Browser connections [SBC] 表示併發連接數
Thinking Time  表示平均用戶思考時間


然來一直以為網站併發用戶數就是指的併發連接數 還是概念的東西沒搞清楚
特作記錄 以後做性能分析指標報告用的著

[root@]#  netstat -na | grep 80 | awk '{print $6}' | sort | uniq -c | sort -rn
  17175 ESTABLISHED
  14537 FIN_WAIT1
   2917 TIME_WAIT
    603 FIN_WAIT2
    501 SYN_RECV
     76 LAST_ACK
      8 CLOSING
      1 LISTEN


如發現系統存在大量TIME_WAIT狀態的連接,通過調整內核參數解決,

vim /etc/sysctl.conf
編輯檔,加入以下內容:
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
然後執行 /sbin/sysctl -p 讓參數生效。



net.ipv4.tcp_syncookies = 1
表示開啟SYN Cookies。當出現SYN等待佇列溢出時,啟用cookies來處理,可防範少量SYN攻擊,默認為0,表示關閉


net.ipv4.tcp_tw_reuse = 1
表示開啟重用。允許將TIME-WAIT sockets重新用於新的TCP連接,默認為0,表示關閉


net.ipv4.tcp_tw_recycle = 1
表示開啟TCP連接中TIME-WAIT sockets的快速回收,默認為0,表示關閉。


net.ipv4.tcp_fin_timeout 修改系統默認的 TIMEOUT 時間
下面附上TIME_WAIT狀態的意義:
用戶端與伺服器端建立TCP/IP連接後關閉SOCKET後,伺服器端連接的埠
狀態為TIME_WAIT是不是所有執行主動關閉的socket都會進入TIME_WAIT狀態呢?
有沒有什麼情況使主動關閉的socket直接進入CLOSED狀態呢?

主動關閉的一方在發送最後一個 ack 後就會進入 TIME_WAIT 狀態 停留2MSL(max segment lifetime)時間這個是TCP/IP必不可少的,也就是“解決”不了的。
也就是TCP/IP設計者本來是這麼設計的


主要有兩個原因
1。防止上一次連接中的包,迷路後重新出現,影響新連接
(經過2MSL,上一次連接中所有的重複包都會消失)
2。可靠的關閉TCP連接
在主動關閉方發送的最後一個 ack(fin) ,有可能丟失,這時被動方會重新發
fin, 如果這時主動方處於 CLOSED 狀態 ,就會回應 rst 而不是 ack。所以
主動方要處於 TIME_WAIT 狀態,而不能是 CLOSED 。
TIME_WAIT 並不會佔用很大資源的,除非受到攻擊。
還有,如果一方 send 或 recv 超時,就會直接進入 CLOSED 狀態

2011年2月13日 星期日

建置WAF(Web Application Firewall)

ModSecurity是一個入侵偵測與防護引擎,它主要是用於Web application,所以也被稱為Web應用程式防火牆。 WAF是針對網頁應用程式攻擊深入分析之設備或軟體, 可補足傳統IDS/IPS 對網頁攻擊偵測效果不佳之問題。
它可以作為Apache Web Server的模組或是單獨的應用程式來運作。ModSecurity的功能是增強Web application的安全性和並保護Web application以避免遭受來自已知與未知的攻擊。

為什麼需要WAF ?
1. 目前受入侵的情況中由網頁應用程式攻擊成功的機率最大.
2. 傳統資安設備無法有效阻擋.
3. 經過SSL加密的通訊, 無法解析.


WAF 特點
1. Input validation check for all client input data
2. Ouput check also available
3. Buffer overflow protection
4. Flexible
5. Anti-Evasion built in
6. Encoding validation built in
7. Up on attack detection, variety action to do: Log/Alert/Block/..call scripts


ModSecurity的部署架構
1. 與Web Server結合
2. 與Apache結合部署為network gateway,當作一個reverse proxy


其防護的概念如下圖所

WAF 軟體 modsecurity
網址:
http://modsecurity.org/

解壓縮
[root@snort darwin]# tar zxvf modsecurity-apache_2.5.12.tar.gz
[root@snort darwin]# cd  modsecurity-apache_2.5.12/apache2
注意: 需要apxs, apxs套件放在httpd-devel 內, 如沒有要自行安裝


[root@snort Server]# rpm -ivh httpd-devel-2.2.3-6.el5.i386.rpm
warning: httpd-devel-2.2.3-6.el5.i386.rpm: Header V3 DSA signature: NOKEY, key ID 37017186
Preparing...                ########################################### [100%]
   1:httpd-devel            ########################################### [100%]


編譯/安裝
[root@snort apache2]# ./configure
[root@snort apache2]#make && make install
[root@snort apache2]# cd ..
[root@snort modsecurity-apache_2.5.12]# cp modsecurity.conf-minimal /etc/httpd/conf.d/modsecurity.conf


編輯 modsecurity.conf檔案
[root@snort modsecurity-apache_2.5.12]# vi /etc/httpd/conf.d/modsecurity.conf
內容如下
在開頭加入前3行
LoadFile /usr/lib/libxml2.so
LoadModule unique_id_module modules/mod_unique_id.so
LoadModule security2_module modules/mod_security2.so
上述modules如有載入就不用再重load !


最後行再加入
Include mod_security/*.conf

解壓/安裝rules
[root@snort darwin]# tar zxvf modsecurity-crs_2.0.5.tar.gz
[root@snort darwin]# cd modsecurity-crs_2.0.5
[root@snort modsecurity-crs_2.0.5]# mkdir /etc/httpd/mod_security
[root@snort modsecurity-crs_2.0.5]# mv base_rules/* /etc/httpd/mod_security/
[root@snort modsecurity-crs_2.0.5]# \mv optional_rules/* /etc/httpd/mod_security/
[root@snort mod_security]# service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                              [  OK  ]


檢查WAF 模組


檢查WAF log檔
[root@snort mod_security]# ls -l /etc/httpd/logs/modsec_*
-rw-r----- 1 root root 1395544 Mar 21 20:41 /etc/httpd/logs/modsec_audit.log
-rw-r----- 1 root root       0 Mar 21 20:37 /etc/httpd/logs/modsec_debug.log


modsecurity設定檔
Mod Securit的四種主要的設定指令。


General configuration options
一般的設定,包括裝規則引擎(rule engineer)開啟等基本指令,常見的設定如下:
#Basic configuration options
SecRuleEngine On
SecRequestBodyAccess On
SecResponseBodyAccess On

#Handling of uploaded files
SecUploadDir /opt/apache-fronted/tmp/
SecUploadKeepFiles Off

#Max request body size for buffering
SecRequestBodyLimit 131072

#Store up to 128KB in memory
SecRequestBodyInMemoryLimit 131072

#Buffer response body up to 512KB in length
SecResponseBodyLimit 524288


Debug logging options
設定Mod Security如何執行debug的log部分,常見的設定如下:
#Debug log
SecDebugLog logs/modsec_debug.log
SecDebugLogLevel 0


Audit logging options
設定Mod Security如何執行audit的log部分,常見的設定如下:
#Serial Audit log
SecAuditEngine RelevantOnly
SecAuditLogRelevantStatus ^5
SecAuditLogParts ABIFHZ
SecAuditLogType Serial
SecAuditLog logs/modsec_audit.log


Rules 基礎
Mod Security最主要的設定部分,為一個以事件為基礎的語言
語法:SecRule VARIABLES OPERATOR [ACTIONS]
VARIABLES:指定哪些變數要進行處理
OPERATOR:要如何處理這些變數取得我們想要的
ACTIONS (optional):當達到上述的處理時,要做什麼動作


Rule處理的階段 Mod Security會在http的五個transaction進行處理.
Phase:1-Request Headers
Phase:2-Request Body
Phase:3-Response Headers、
Phase:4-Response Body
Phase:5-logging

因此,在rule的部分即可指定你要transaction的哪一部份進行處理。

VARIABLES 
一些常見的變數:
ARGS、ARGS_NAMES、ARGS_GET、ARGS_GET_NAMES、ARGS_POST、ARGS_POST_NAMES
AUTH_TYPE
REQBODY_PROCESSOR、REQBODY_PROCESSOR_ERROR
FILES、FILES_NAMES、FILE_SIZES
REMOTE_ADDR、REMOTE_HOST、REMOTE_PORT
REQUEST_BODY、REQUEST_COOKIES、REQUEST_COOKIES_NAMES、REQUEST_FILENAME
RESPONSE_BODY

Rule中的變數部分可以一個以上, 以”|”來區隔即可,如果設定的規則超過多行,則可用”\”來進行分隔。

OPERATOR
預設的OPERATOR是正規表示法(Regular Expression),但其實ModSecurity提供不少可用的OPERATOR,利用”@”即可指定要用何種OPERATOR,例如SecRule REQUEST_URI
“@rx iii”。

以下是一些範例:
SecRule REMOTE_ADDR "^192\.168\.1\.101$"
REMOTE_ADDR:指定變數對象為遠端連線的IP位址
"^192\.168\.1\.101$":針對上述的變數進行比對,如果非192.168.1.101,則符合,可指定要做何種動作
SecRule ARGS "@validateUtf8Encoding"
ARGS:指定變數為http傳遞的參數
"@validateUtf8Encoding":指定OPERATOR為對這些參數進行Utf8編碼進行檢查
SecRule FILES_TMPNAMES "@inspectFile /path/to/inspect_script.pl"
FILES_TMPNAMES:指定變數為上傳檔案的暫存名稱
"@inspectFile /path/to/inspect_script.pl":指定利用inspect_script.pl檔案的語法來檢查上傳檔案
ACTIONS
指定如果VARIABLE有符合OPERATOR的情況時,要執行何種動作。


ACTIONS主要區分為五種型態:
Disruptive actions (中斷目前的transaction)

deny、drop、redirect、proxy、pause…
Non-disruptive actions (改變狀態)
Append、auditlog、exec…
Flow actions (改變規則流動)
allow、chain、pass、skip…
Meta-data actions (包含規則的metadata)
id、rev、severity、msg、phase、log, nolog、…
Data actions (可放置內容給其他action用)
capture、status、t、xmlns…

測試WAF
寫一支小php程式測試
[root@snort mod_security]# vi /var/www/html/checkmd.php
內容如下
<?
 file $text=$_GET['file'];
 echo "Content of File $text";
 echo `cat $text`;
?>


在網頁上輸入 http://主機/checkcmd.php?file=/etc/passwd
如果出現畫面所示, 表示ModSecurity2有在running .


使用一些工具作測試
Browser Extension –IE
1. TamperIE  http://www.bayden.com/Other 
用於竄改瀏覽器送出的參數; 可繞過Javascript檢測
2. HTTPWatch  http://www.httpwatch.com/
顯示IE的每一個Request/Response; 攻擊/除錯兩相宜
3. HTTP Analyzer http://www.ieinspector.com/httpanalyzer
類似HTTPWatch

  Browser Extension –Firefox
1. Tamper Data  https://addons.mozilla.org/firefox/966/
2. Add N Edit Cookies  https://addons.mozilla.org/firefox/573
3. Live HTTP Headers  https://livehttpheaders.modzdev.org/
4. HttpFox  https://addons.mozilla.org/firefox/addon/6647/
5. RefControl  https://addons.mozilla.org/firefox/953/
6. HackBar  https://addons.mozilla.org/firefox/addon/3899/

 Web Proxy
1. Paros  http://www.parosproxy.org/
2. Odysseus  http://www.bindshell.net/tools/odysseus
3. Fiddler  http://www.fiddlertool.com/fiddler/
4. Burp suit  http://portswigger.net/suite/
5. WebScarab  http://www.owasp.org/index.php/Category:OWASP_WebScarab_Project
6. Charles  http://www.charlesproxy.com/
7. SPIKE Proxy  http://www.immunitysec.com/resource-freesoftware.shtml

  Brute Force Attack
1. THC-Hydra  http://www.thc.org/thc-hydra/
2. Brutus AET2  http://www.hoobie.net/brutus/
3. Unsecure
4. ObiWaN
5. Cain & Abel
6. Authforce
7. WebCracker
8. Lophtcrack

Web Vulnerability Scanner
1. Nikto (free)
2. Wikto (free)
3. Acunetix- Web Vulnerability Scanner (Commericial)
4. IBM AppScan  (Commericial)  
5. HP WebInspect  (Commericial)  較準但價格超貴
6. N-Stalker – Web Application Security Scanner  (Commericial)

Web Stress Test
1. ab (Apache Benchmark)  http://httpd.apache.org/
2. JMeter  http://jakarta.apache.org/jmeter/
3. Microsoft Web Application Stress Tool
4. Many Tools  http://www.softwareqatest.com/qatweb1.html

註: 上述皆可對modsecurity module作測試

Mod_security內建許多RULE
1. Protocol Violation
2. Protocol Anomalies
3. Request Limit
4. Http Policy
5. Bad Robots
6. Generic Attacks
7. Trojans
8. Outbound
9. etc……. 
  
怎麼自行加入/設定rule是很重要的
 一些範例
使用範例1
SecRule REQBODY_PROCESSOR_ERROR "!@eq 0“ "phase:2,log,deny,msg:'Failed to parse request body.',severity:2“

說明:
REQBODY_PROCESSOR_ERROR:指定針對request body發生的processor發生的錯誤的代碼
"!@eq 0“:當不等於0時,即有錯誤發生時
處理動作 "phase:2,log,deny,msg:'Failed to parse request body.',severity:2“
phase:2:由於對象為request body,因此指定在phase:2進行
log:當情況符合(發生錯誤),將錯誤log起來
deny:將這個transaction拒絕
msg:'Failed to parse request body':網頁上並顯示出這樣的錯誤訊息
severity:2:將此狀況列為嚴重程度為2

使用範例2
SecRule MULTIPART_UNMATCHED_BOUNDARY "!@eq 0" \
"phase:2,log,deny,msg:'Multipart parser detected a possible unmatched boundary.'"


說明:
MULTIPART_UNMATCHED_BOUNDARY:指定針對multipart發生unmatched boundary的錯誤
"!@eq 0“:當不等於0時,即有錯誤發生時
處理動作 "phase:2,log,deny,msg:'Multipart parser detected a possible unmatched boundary.'"
phase:2:由於對象為request body,因此指定在phase:2進行
log:當情況符合(發生錯誤),將錯誤log起來
deny:將這個transaction拒絕
msg:'Multipart parser detected a possible unmatched boundary.':網頁上並顯示出這樣的錯誤訊息
The Core rule sets
此一系列的規則可防護一般網頁應用程式常見已知的弱點或其他未知的弱點。
這一系列的規則使用下列的技術:
HTTP protection
Detect all abnormal HTTP request
Common Web Attacks Protection
SQL Injection、Cross-Site Scripting (XSS) …
Automation detection
crawler
Trojan Protection
Error Hiding
Detect errors sent by the web server

其它範例
SecRule REMOTE_ADDR “!^192.168.1.1$” deny  //限制登入來源
SecRule REMOTE_ADDR "^192\.168\.1\.3$" redirect:http://www.google.com.tw
SecServerSignature "Microsoft-IIS/6.0"  //可隱藏伺服器版本,或任一填其它版本欺騙hacker
SecRule ARGS “(insert|select|update|delete)” deny  //避免SQL Injection
SecRule ARGS “<.+>” deny   //避免HTML Tags Injection
SecRule “\.\./” deny   //避免Directory Traversal
SecRule “\.\./” redirect:http://www.google.com 或者SecRule “\.\./” log, redirect:/
SecRule ARGS_NAMES  “^admin$”  deny   //限制管理者
SecRule OUTPUT “\d{4}-\d{4}-\d{4}-d{4}” “deny,phase:4”   //避免信用卡號外露
SecRule OUTPUT “Warning:” “deny,phase:4,exec:mailadm.pl” //避免php錯誤訊息外露
SecRule OUTPUT “ODBC Drivers” “deny,phase:4,exec:mailadmin.pl”   //避免asp sql error外露

將上述加入 modsecurity.conf 檔案內即可生效
註. 以上為簡易範例,供參考!!
如何設定mod_security rule是相當重要的!
不錯的snort討論區
https://forums.snort.org/forums/snort-newbies
以上皆為較基本的實作,日後可好好研究snort rule語法及modsecurity rule如何設定, 對該網站安全有很好保護!!!

大功告成!!

Apache log傳送至syslog

[root@snort ]# vi /usr/local/sbin/apache2syslog_error
內容如下
#!/usr/bin/perl
use Sys::Syslog qw (:DEFAULT setlogsock);

setlogsock('unix');
# open our log socket
openlog('httpd', 'pid', 'local7');

# log all our input
while (<STDIN>) {
       syslog('ERR', $_);
}

# close the log socket
closelog;

[root@snort ]#vi /usr/local/sbin/apache2syslog
#!/usr/bin/perl
use Sys::Syslog qw (:DEFAULT setlogsock);
setlogsock('unix');
# open our log socket
openlog('httpd', 'pid', 'local7');

# log all our input
while (<STDIN>) {
       syslog('info', $_);
}

# close the log socket
closelog;


[root@snort ]# chown root:root /usr/local/sbin/apache2sys*
[root@snort ]# chmod 700 /usr/local/sbin/apache2sys*

編輯httpd.conf檔案[root@snort phplogcon]# vi /etc/httpd/conf/httpd.conf
ErrorLog  | /usr/local/sbin/apache2syslog_error
CustomLog | /usr/local/sbin/apache2syslog  combined
[root@snort phplogcon]# service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                             [  OK  ]