作者:
qwerty
·
2014/08/11 10:43
0x00 背景
做Web層面的安全測試,免不了要做中間人代理來截包分析。常用的工具有BurpSuit,Fiddler,Charles等等。關於這些工具的用法網上已經有很多介紹,這裡就不贅述了。然而在測試一些安全性高的站點時,往往會遇到SSL通訊的問題。這裡對這些數字證書的問題進行一個小結,歡迎拍磚交流。
0x01 數字證書
數字證書主要在網際網路上的用於身份驗證的用途。 安全站點在獲得CA(Certificate Authority)認證後,獲得一個數字證書,以此來標識其合法身份的真實性。
數字證書的格式遵循X.509標準。(X.509是由國際電信聯盟(ITU-T)制定的數字證書標準。它設定了一系列嚴格的CA分級體系來頒發數字證書。) 數字證書主要分為伺服器證書和客戶端證書。伺服器證書(SSL證書)用來進行身份驗證和通訊的加密,客戶端證書主要用於身份驗證和電子簽名。下面對數字證書的組成結構和工作原理進行一個簡單的介紹。 最簡單的證書包含了:
1. 證書內容
a) 證書所有者的公鑰
b) 頒發者資訊
c) 使用者資訊
d) 等等
2. CA的數字簽名 (CA使用私鑰對證書內容的報文摘要進行加密後的結果)
3. 簽名演算法
真實的數字證書主要結構如下圖:
其中證書內容欄位的詳細結構如下:
CA的數字簽名是CA用其私鑰對證書資訊的HASH值加密後的結果。由於使用私鑰加密以及非對稱加密演算法的特性,數字簽名具有不可偽造的特點,同時報文摘要也保證了證書資訊的完整性。使用者可以使用CA的公鑰對數字證書中CA的數字簽名進行解密來判斷該數字證書資訊的真實性。 客戶端校驗伺服器證書的大致流程如下: 1. 檢視證書是否過期 2. CA是否可靠 3. CA的公鑰能否正確解開伺服器證書的CA數字簽名,即證書的簽名值 4. 伺服器證書上的域名是否和伺服器的實際域名相匹配
其中CA的根證書大多是由作業系統預裝好並將它們設定為受信任的證書。所謂根證書就是未被簽名的公鑰證書或自簽名的證書,是CA給自己頒發的證書,包含了CA的公鑰等資訊。安裝某個CA的根證書,就表示信任這個CA,它是證書信任鏈的開始。國際著名的CA有:verySign,Batltimore,Entrust等。 中國金融認證中心(China Financial Certification Authority,簡稱CFCA)是經中國人民銀行和國家資訊保安管理機構批准成立的國家級權威安全認證機構,是國家重要的金融資訊保安基礎設施之一。
Tips: 某些瀏覽器內建的CA證書列表 https://www.mozilla.org/en-US/about/governance/policies/security-group/certs/included/
0x02 證書格式
常見的證書檔案有以下格式:
格式 副檔名
DER .cer .crt .rsa
PKCS7 .p7b .p7r
CMS .p7c .p7m .p7s
PEM .pem (ASCII檔案 一般使用base64編碼)
PKCS10 .p10 .csr (ASCII檔案)
SPC .pvk .spc
常見的金鑰庫(keystore)檔案格式如下:
格式 副檔名
JKS .jks .ks
JCEKS .jce
PKCS12 .p12
BKS .bks
UBER .ubr
0x03 代理軟體的數字證書
BurpSuit和Fiddler等代理軟體可以用來攔截HTTPS流量。它們使用自帶的一個SSL證書與客戶端進行互動,充當中間人的角色去轉發資料包。由於這些代理軟體的證書是自簽名的根證書,而未經過知名CA機構認證,所以預設是不受信任,瀏覽器會進行警告阻攔。
使用桌面瀏覽器測試時,可以透過新增例外的方式信任它們的證書。在移動端測試時,也可以匯出這些代理軟體的證書,再將其安裝到移動裝置,方便對移動應用的HTTPS流量進行代理。
在瀏覽器證書管理器中匯出BurpSuite證書:
Fiddler選項中可以直接匯出證書:
0x04 移動應用測試中的數字證書
直接安裝
代理軟體的數字證書可以安裝到手機系統中,方便對走HTTPS流量的APP進行安全測試。 安卓系統中的伺服器證書安裝方法如下: 將數字證書複製到安卓的sdcard目錄下。在設定->安全->選擇從SDCARD安裝證書。
IOS中也是類似的操作。
匯入到金鑰庫 除了直接安裝代理軟體證書之外,有的app會自帶受其信任的金鑰庫,如下: 在/asserts資原始檔夾下,存在幾個bks金鑰庫檔案。
可以使用工具開啟bks金鑰庫,並將代理軟體的證書新增匯入進去並儲存。
當然,也可以使用keytool命令列進行證書匯入。
Tips: Android系統中CA證書檔案的位置在:/system/etc/security/cacerts.bks
http://blog.csdn.net/haijun286972766/article/details/6247675
修改檢測程式碼 有的APP還會直接在程式碼中進行對伺服器證書進行校驗。
可以逆向app得到smali程式碼,修改驗證邏輯,再重編譯打包,從而繞過對伺服器證書的驗證。 具體案例可以看這篇部落格:http://cih.so/?p=476
0x05 關於客戶端證書
除了服務端證書外,有的網銀等高安全性的系統還會要求使用者提供客戶端證書進行身份驗證。如果使用者證書不正確,有的就直接無法連線服務端,有的會有如下提示:
客戶端證書主要用作身份驗證和電子簽名的作用。一般網銀包含私鑰的客戶端證書都被儲存在USBKEY中,儲存在USBKEY中包含私鑰的證書不能被匯出和複製。可以使用USBKEY的證書管理工具安裝USBKEY中的證書,然後在瀏覽器中匯出其公鑰證書,並在代理軟體中設定該客戶端證書。瀏覽器中的匯出方法如下:
測試過程中,如果發現伺服器會檢測使用者的客戶端證書,並且沒有設定客戶端證書,Fiddler會提示如下資訊:
可以將匯出的客戶端公鑰證書放到如上所示的目錄中。
BurpSuit也可以設定客戶端證書:
除了儲存在USBKEY中的使用者證書(客戶端證書),CFCA也提供軟證書的下載,也就是包含私鑰的證書檔案。在CFCA下載證書時,選擇Microsoft Enhanced Cryptographic Provider v1.0
將軟證書安裝到瀏覽器後,也可以透過同樣的方法匯出公鑰證書。另外還可以匯出包含私鑰的證書,匯出時需要設定密碼。在Fiddler代理中設定客戶端的公鑰證書後,就可以直接進行代理了。
0x06 關於安卓APP簽名
安卓app簽名的數字證書不需要權威機構來認證,是開發者自己產生的自簽名數字證書。數字證書都是有有效期的,Android只是在應用程式安裝的時候才會檢查證書的有效期。如果程式已經安裝在系統中,即使證書過期也不會影響程式的正常功能。
Android將數字證書用來標識應用程式的作者、在應用程式之間建立信任關係,而不是用來決定終端使用者可以安裝哪些應用程式。
由於惡意開發者可能透過使用相同的包名來混淆替換已經安裝的程式,簽名可以保證相當名字但是簽名不同的app不被替換。
另外,在申請一些特別許可權的時候,需要驗證時會使用簽名。 Eclipse除錯編譯app時,是使用debug證書對apk簽名的。安裝adt開發外掛後的eclipse可以直接使用android tools圖形化介面對apk進行簽名。
簽名之後會多出一個META-INF資料夾
/CERT.RSA (包含證書資訊)
/CERT.SF
/MANIFEST.MF
檢視安卓簽名資訊
keytool -printcert -file CERT.RSA
本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!