前言:
信息收集分類:
1、主動式信息搜集(可獲取到的信息較多,但易被目標發現)
2、通過直接發起與被測目標網絡之間的互動來獲取相關信息,如通過Nmap掃描目標系統。
3、被動式信息搜集(搜集到的信息較少,但不易被發現,如通過搜索引擎搜索)
4、通過第三方服務來獲取目標網絡相關信息。如通過搜索引擎方式來搜集信息。
搜集什么信息
1、whois信息
2、網站架構(語言、中間件、數據庫、平台)
3、dns信息(通過查詢dns可以檢測是否存在dns域傳送和域行走)
4、子域名搜集(搜索引擎和工具以及漏洞)
5、敏感目錄及敏感信息、源碼泄露(搜索引擎+工具、GitHub等)
6、系統漏洞(系統版本漏洞是否修補)
7、旁站查詢(通過IP反查)
8、C端查詢(確認大公司或組織網段內子站)
9、指紋信息(框架探測)
10、端口服務
11、備案信息(whois反查、)
12、真實ip(繞過CDN)
13、探測waf(后續可確定Bypass方式)
14、社工(朋友圈、微博、qq空間、求職、交易等社交平台)
15、企業信息(天眼查、企業信用信息公示系統、工業和信息化部ICP/IP地址/域名信息備案管理系統)
信息搜集的流程
上面我已經列舉了需要搜集的信息,然后我給它們分了一下類。
我考慮到一個網站的組成是由域名、服務器、網站程序組成的。
因此:
首先入手域名方面:whois、子域名、備案信息;
其次是入手服務器方面:dns信息、端口服務、真實ip;
然后入手網站程序(web層)方面:網站架構、敏感目錄及敏感信息、源碼泄露(搜索引擎+工具)、脆弱系統(網絡空間)、旁站查詢、C端查詢、指紋信息、探測waf;
最后入手企業方面:天眼查、企業信用信息公示系統
0x00:IP發現
- 1.IP反查域名(查詢旁站)
如果你的滲透目標網站是一台虛擬主機,那么通過IP反查到的域名信息往往很有價值, 因為一台物理服務器上面可能運行多個虛擬主機,這些虛擬主機具有不同的域名,但通常共用一個IP地址。如果你知道有哪些網站共用這台服務器,就有可能通過此台服務器上其他網站的漏洞獲取服務器控制權,進而迂回獲取滲透目標的權限,這種技術也稱為“旁注”。
站點和工具:
- http://www.ip-adress.com/reverse_ip
- http://www.7c.com/
- https://dns.aizhan.com/
- https://tools.ipip.net/ipdomain.php
- http://www.webscan.cc/
- http://dns.bugscaner.com/
- 2.域名查詢IP
知道一個站點的域名需要得到它的IP以便之后獲取端口信息或掃描等后續工作。
站點和工具:
- http://www.webscan.cc/
- http://www.yunsee.cn/
- https://www.whatweb.net/
- http://ip.tool.chinaz.com/
- http://dns.bugscaner.com/
注:判斷是否目標使用CDN(1).ping 目標主域,觀察域名的解析情況,以此來判斷是否使用了 CDN;(2).利用在線網站 17CE,進行全國多地區的 ping 服務器操作,然后對比每個地區 ping 出的 IP 結果,查看這些 IP 是否一致,如果都是一樣的,極有可能不存在 CDN。如果 IP 大多不太一樣或者規律性很強,可是嘗試查詢這些 IP 的歸屬地,判斷是都存在 IP。在確認目標用了 CDN 的情況下:
- 內部郵箱源(讓服務器給你發郵件看郵件頭IP)(最可靠)
- 通過zmpap全網爆破查詢真實IP(可靠)
- 掃描網站測試文件
- 分站域名(根據收集分站查看產生交互最多的站)
- 國外訪問(App Synthetic Monitor)
- 查詢域名解析記錄(NETCRAFT)(查詢域名歷史IP)
- 如果網站有 App,抓 App 的請求
- 繞過 CloudFlare CDN 查找真實 IP(CloudFlareWatch)
- 3.IP WHOIS查詢
IP WHOIS就是查詢IP的詳細信息的數據庫(如IP使用人和IP使用人的相關信息等)。
- http://www.guoxue.com/whois/index.php
- http://whois.bugscaner.com/
- https://www.whois.com/whois
- https://www.cxw.com/
- 4.C端存活主機探測
- https://phpinfo.me/bing.php
- http://cduan.cc/c/
- http://www.webscan.cc/
- https://github.com/se55i0n/Cwebscanner
也可以使用Nmap掃描:
Nmap: nmap -sP www.XXX.com/24 || nmap -sP 192.168.1.*
- 5.C段常見端口探測
- (1)最笨的方法:C段導入到文件,nmap掃描。
-iL參數:掃描文件中列出的所有IP地址。nmap -iL ip.txt。配合其他自定義限制條件掃描。
- (2)其他工具
神器masscan: https://github.com/robertdavidgraham/masscan
- Masscan安裝和使用:
http://zone.secevery.com/article/1098
0x01:域名發現
- 1.子域名發現
開始滲透一個網站前,需要知道網站的網絡資產:域名、IP等,而IP和域名有着直接的解析關系,所以如何找到網站所有子域名是關鍵。
- (1)DNS枚舉(根據字典爆破)
域名可以通過收集常用域名字典,去DNS服務商查詢是否有解析記錄來枚舉子域名。很多工具都是通過預定義的字典枚舉:如Lay子域名挖掘機,subbrute等。
DNS服務商的字典是最准確有效的,先找到一份DNSPod公布的使用最多的子域名:dnspod-top2000-sub-domains.txt//GitHub上的
- (2)自身泄露
可通過https://github.com/FeeiCN/WebProxy代理電腦所有流量,從流量中搜索出現交互的子域名,如域名跳轉、Response、網絡請求中的子域名。缺點:麻煩且沒產生交互的子域名無法探測,略雞肋。
- (3)搜索引擎
使用百度,bing,Google等搜索引擎,可通過site關鍵字查詢所有收錄該域名的記錄,子域名權重較高會排在前面。具體規則網上很多,可參考: https://zhuanlan.zhihu.com/p/22161675https://www.freebuf.com/articles/network/169601.html具體使用:以 secevery 為例,可以通過搜索 site:secevery.com 來得到指定的網站內容。
- (4)第三方查詢
--有許多擁有大量 DNS 數據集的第三方服務,可通過他們來檢索給定域的子域。如VirusTotal,dnsdumpser
腳本工具Sublist3r( https://github.com/aboul3la/Sublist3r) 使用各種資源來枚舉子域。通過諸如 Google,Yahoo,Bing,百度和 Ask 等許多搜索引擎來枚舉。Sublist3r 還使用 Netcraft,Virustotal,ThreatCrowd,DNSdumpster 和 ReverseDNS 等第三方服務來枚舉子域。缺點:信息多很繁雜且有錯誤,許多站已經關閉,內容需要篩選。
- (5)crossdomain.xml
利用跨域策略文件,以 http://www.sina.com.cn/crossdomain.xml為例:
- (6)Google HTTPS證書信息
Google透明度報告中的證書透明度項目是用來解決HTTPS證書系統的結構性缺陷,它能夠讓所有人查詢各個網站的HTTPS證書信息,從而能發現簽發了證書的子域名。利用SSL證書的注冊登記發現子域名。
使用收集 CT(Certificate Transparency)日志的搜索引擎,是發現某個域證書最簡單的方法。以下是一些流行的搜索引擎:
可以結合Masscan# ct.py - extracts domain names from CT Logs(shippedwith massdns) # massdns - will find resolvable domains & adds them to a file./ct.py icann.org | ./bin/massdns -r resolvers.txt -tA -q -a -o -w icann_resolvable_domains.txt -//讀取文件里面的CT信息搜索還可以直接通過本地證書:大廠的SSL證書一般都是一證多用,根據這個特性,可以得到一些子域名.eg:
使用SSL證書缺點很明顯,沒有注冊SSL證書的子域名無法查到。
- (7)自治系統編號(ASN)
使用dig或host來解析指定域的IP地址(可以得到IP所在組織的IP域范圍)。使用IP查找ASN號碼:https://asn.cymru.com/cgi-bin/whois.cgi
也可以使用域名查詢ASN號碼:https://bgp.he.net/
找到的ASN號碼可用於查找域的網絡塊。使用Nmap腳本可以實現使用ASN號碼來查找域的網絡塊。$ nmap --script targets-asn --script-args targets-asn.asn=XXXX
- (8)利用域傳送漏洞
因為對DNS服務器配置不當,導致任意IP都可以直接向DNS服務器請求數據,從而導致該域名的所有子域名暴露,可以寫腳本也可以通過網站查詢DNS。
域傳送漏洞漏洞很老舊不常見。kali下檢測:root@kali:~# dig +short @8.8.8.8 secevery.com ns
得到了目標ns服務器,接下來使用目標ns服務器嘗試傳送dig @dns24.hichina.com secevery.com axfr發現Transfer failed失敗即不存在漏洞。Kali下dns子域探測工具:dnsmap,dnsenum,fierce。也可以Windows下nslookup查詢:
- (9) FDNS(forward DNS,DNS轉發)
FDNS數據集作為 Project Sonar 的一部分發布。這些數據是通過提取來自多個源的域名並且給每個域發送 ANY 請求來收集的。這些數據是 gzip 格式的 json 文件。我們可以解析數據集來查找給定域的子域。數據集是很大的(壓縮后約 20 + GB,未壓縮約有 300 + GB)。
- https://registry.opendata.aws/rapid7-fdns-any/
- https://github.com/rapid7/sonar/wiki/Forward-DNS//GitHub說明
# Command to parse& extract sub-domains for a given domain$ curl -silenthttps://scans.io/data/rapid7/sonar.fdns_v2/20170417-fdns.json.gz | pigz -dc | grep “.icann.org” | jqFDNS能搜索到的子域名比爆破和CT查詢和存在域傳送加起來都多。但文件過大使用起來很費事。
- (10)zone walking(NSEC)區域行走
DNSSEC協議的一個重要功能是能根據"DNS中的已驗證拒絕存在"權威的斷言給定域名不存在,但它允許區域行走,可以從一個域到另一個域。協議這樣寫->https://tools.ietf.org/rfc/rfc7129.txt現在主流的NSEC3協議是NSEC協議的替代,但是仍然有很多域在使用NSEC。使用ldns-walk工具來檢測使用NSEC域名TLD列表 http://data.iana.org/TLD/tlds-alpha-by-domain.txt安裝之后$ ldns-walk domainname即可使用//linux下安裝使用。wget https://www.nlnetlabs.nl/downloads/ldns/ldns-1.7.0.tar.gz 除了這些還有如網絡深度爬蟲等方法能探測子域名。
- 2.關聯域名發現
- (1)注冊人和郵箱反查域名
先whois獲取注冊人和郵箱,再通過注冊人和郵箱反查域名。
- https://whois.chinaz.com/
- http://whois.4.cn/reverse
- https://whois.aizhan.com/reverse-whois/
- http://www.langongju.com/domain/reverse
缺點很明顯:除了大廠之外很多公司都是DNS解析的運營商注冊的,查到的是運營商代替個人和小公司注冊的網站信息。
- (2)相似域名查詢
根據目標公司名稱來查找可能是目標資產的相似域名。
- https://www.whois.net/
- https://typoku.com.cutestat.com/
- https://github.com/elceef/dnstwist//相似、釣魚域名檢測。
0X02:端口信息探測
- 1、快速判斷端口是否開啟:
a、http://coolaf.com/tool/port使用方式: 直接輸入要測試的域名,然后指定要測試的端口。 不過每次只能指定50個端口。
b、https://tool.lu/portscan/index.html 跟上一個工具差不多都一樣,只不過每次能測試100個端口。使用方式也一樣。
c、http://www.matools.com/port 沒有說明端口限制,並且會顯示端口的服務。只是每次掃描的時候,需要輸入驗證碼。
- 2、對服務器的信息進行詳細的收集:
主機發現,生成存活主機列表:nmap -sn -T4 -oG Discovery.gnmap 192.168.10.0/24grep "Status: Up" Discovery.gnmap | cut -f 2 -d ' ' > LiveHosts.txt 端口發現,發現全部端口:nmap -sS -T4 -Pn -p 0-65535 -oN FullTCP -iL LiveHosts.txt #一般選用這個,因為速度比較快。nmap -sU -T4 -Pn -p 0-65535 -oN FullUDP -iL LiveHosts.txt 發現大部分常用的端口:nmap -sS -T4 -Pn -oG TopTCP -iL LiveHosts.txtnmap -sU -T4 -Pn -oN TopUDP -iL LiveHosts.txtnmap -sS -T4 -Pn --top-ports 3674 -oG 3674 -iL LiveHosts.txt 系統和服務檢測:nmap -O -sV -T4 -Pn -p U:53,111,137,T:21-25,80,139,8080 -oG OS_Service_Detect -iL LiveHosts.txt 系統掃描:nmap -O -T4 -Pn -oG OSDetect -iL LiveHosts.txtnmap -O --osscan-guess 192.168.1.134 服務版本偵測:nmap -sV -T4 -Pn -oG ServiceDetect -iL LiveHosts.txtNmap命令詳見:http://zone.secevery.com/article/245
- 0X03:網站信息收集
- 1、指紋識別
代碼框架識別、中間件、CMS識別: https://www.whatweb.net/ 能得到的目標網站的 IP、中間件類型以及版本、語言環境(帶版本)
http://www.yunsee.cn/finger.html 只能判斷出一種語言環境,代碼框架、中間件的版本信息。
http://whatweb.bugscaner.com/look/ 代碼框架、web框架為ASP.NET、語言為PHP、中間件為IIS6.0 除此之外還有一些額外的信息:同ip網站CMS查詢、icp備案查詢、whois查詢、網站地址、服務器的操作系統、子域名查詢、網站CDN服務商查詢、CDN緩存命中查詢。 信息還是挺多的。與上邊兩個相比,我更傾向於選擇第三個網站,雲悉的信息那么少,大概是沒有登陸的緣故吧。它的賬號是要購買的。
- 2、waf識別:
wafw00f 一個識別waf的很成熟的工具,使用方式也很簡單。 github項目地址:https://github.com/EnableSecurity/wafw00f kali上自帶wafw00f,一條命令直接使用。建議最好在kali下使用,windows下的使用很麻煩。
nmap的擴展腳本,眾所周知,nmap是一個端口掃描工具。但是它額外有的擴展模塊,使得它具有了識別和繞過waf的能力。
- 2、敏感路徑探測
- 1、Git源碼泄露
成因及危害:當前大量開發人員使用git進行版本控制,對網站進行自動部署。如果配置不當,可能會將.git文件部署到線上環境,這就引起了git泄露漏洞。在網站安全維護方面,git和svn信息泄露,是非常常見也是非常致命的漏洞。會導致整個網站的源碼泄露。 漏洞檢測: 批量尋找:".git" intitle:"index of"
對單個網站進行檢測: a、githack,github上的地址:https://github.com/lijiejie/GitHack 使用方法:python GitHack.py http://xxx.com/.git/ 這個直接就可以獲取到網站的源碼和圖片該工具建議在有git工具的linux環境下使用,我在 windows10環境下使用的時候,會報Error 10060和Error 183
手工驗證的方法,如下。在kali linux下, wget --mirror --include-directories=/.githttp://www.xxx.com/.git cd www.xxx.com www.xxx.com文件夾是自動創建的。 git reset --hard后續學習:https://blog.csdn.net/qq_36869808/article/details/88909961
- 2、SVN源碼泄露
介紹:跟git一樣,都是用來版本迭代的一個功能。具體一點就是使用svn checkout功能來更新代碼。 產生原因以及危害:沒有配置好目錄訪問權限,從而導致該漏洞被人利用,整個網站的源碼泄露。 批量尋找:".svn" intitle:"index of" 利用工具及過程: 工具:svnExploit github地址:https://github.com/admintony/svnExploit 利用過程: a、判斷.svn的版本信息
前者版本小於1.7,后者版本大於1.7 版本小於1.7的: python2 SvnExploit.py -u https://xxx.com/.svn 查看信息,把泄露的文件列出來。 python2 SvnExploit.py -u https://xxx.com/.svn --dump 將網站的源碼下載下來。
版本大於1.7的, 1、列出所有的文件。 2、把所有的文件dump下來。
后續鑽研:https://www.cnblogs.com/batsing/p/svn-bug.html
- 3、網站文件備份
直接掃目錄就可以得到,工具:7kbscan、御劍都可以。
- 0X04:互聯網信息收集
- (1)google和GitHub
使用谷歌關鍵字。例如搜索site:github.com secevery.com搜索目標公司程序員上傳到GitHub上的代碼和敏感信息,可能泄露如數據庫連接信息、郵箱密碼、uc-key、阿里的osskey、甚至是網站源代碼。
還可以site:GitHub.com svn(smtp等) @XX.com(user,password)等在后面添加限制腳本類型或者服務類型。
- intext:后台登錄
查詢頁面中含有后台管理的網站,這里還可以利用site:語句(下同)指定查找的網站(包含子域名)中頁面含有后台登錄的站點
- intitle:管理登錄
查找網站標題中存在管理登錄的頁面
- filetype: pdf
查找網站中pdf格式的文件,也可以搜索網站sql或者壓縮包等文件
- inurl: php?id=
查找url中帶有php?id=的網站
- filetype:php site:secevery.com查找secevery中的PHP文件
- (2)shodan搜索引擎
shodan網絡搜索引擎偏向網絡設備(攝像頭、路由器)以及服務器(端口、開啟服務、服務器平台版本)的探測,具體內容可上網查閱,這里給出它的高級搜索語法。https://www.shodan.io/
可以直接搜索到站點IP開啟的端口、服務器版本及平台、開啟服務、地理位置等搜索語法可以直接搜索到站點IP開啟的端口、服務器版本及平台、開啟服務、地理位置等搜索語法
- hostname: 搜索指定的主機或域名,例如 hostname:”google”
- port: 搜索指定的端口或服務,例如 port:”21”
- country: 搜索指定的國家,例如 country:”CN”
- city: 搜索指定的城市,例如 city:”NanYang”
- org: 搜索指定的組織或公司,例如 org:”google”
- isp: 搜索指定的ISP供應商,例如 isp:”China Telecom”
- product: 搜索指定的操作系統/軟件/平台,例如 product:”Apache httpd”
- version: 搜索指定的軟件版本,例如 version:”1.6.2”
- geo: 搜索指定的地理位置,例如 geo:”31.8639, 117.2808”
- before/after: 搜索指定收錄時間前后的數據,格式為dd-mm-yy,例如 before:”11-11-15”
- net: 搜索指定的IP地址或子網,例如 net:”210.45.240.0/24”
- (3)censys搜索引擎
censys搜索引擎功能與shodan類似,偏向網絡設備和服務器的信息探測。地址:https://www.censys.io/
搜索語法默認情況下censys支持全文檢索。
- 23.0.0.0/8 or 8.8.8.0/24 可以使用and or not
- 80.http.get.status_code: 200 指定狀態
- 80.http.get.status_code:[200 TO 300] 200-300之間的狀態碼
- location.country_code: DE 國家
- protocols: (“23/telnet” or “21/ftp”) 協議
- tags: scada 標簽
- 80.http.get.headers.server:nginx 服務器類型版本
- autonomous_system.description: University 系統描述
- (4)FoFa搜索引擎
FoFa搜索引擎偏向資產搜索。http://fofa.so
搜索語法直接輸入查詢語句,將從標題,html內容,http頭信息,url字段中搜索
- title="abc" 從標題中搜索abc。
- header="abc" 從http頭中搜索abc。
- body="abc" 從html正文中搜索abc。
- domain="secevery.com" 搜索根域名帶有secevery.com的網站。
- host=".gov.cn" 從url中搜索.gov.cn,注意搜索要用host作為名稱。
- port="443" 查找對應443端口的資產。
- ip="1.1.1.1" 從ip中搜索包含1.1.1.1的網站,注意搜索要用ip作為名稱。 如果想要查詢網段,可以是:ip="192.168.111.1/24",
- protocol="https" 搜索制定協議類型(在開啟端口掃描的情況下有效)。
- city="Beijing" 搜索指定城市的資產。
- region="Henan" 搜索指定行政區的資產。
- country="CN" 搜索指定國家(編碼)的資產。
- cert="google.com" 搜索證書(https或者imaps等)中帶有google.com的資產。
- banner=users && protocol=ftp 搜索FTP協議中帶有users文本的資產。
- type=service 搜索所有協議資產,支持subdomain和service兩種。
- os=windows 搜索Windows資產。例: 搜索Windows資產
- server=="Microsoft-IIS/7.5" 搜索IIS 7.5服務器。例: 搜索IIS 7.5服務器
- app="海康威視-視頻監控" 搜索海康威視設備,更多app規則。例: 搜索海康威視設備
- after="2017" && before="2017-10-01" 時間范圍段搜索。例: 時間范圍段搜索
- 高級搜索:可以使用括號 和 && || !=等符號,如
- title="powered by" && title!=discuz
- title!="powered by" && body=discuz
- ( body="content=\"WordPress" || (header="X-Pingback" && header="/xmlrpc.php" && body="/wp-includes/") ) && host="gov.cn"
- 新增==完全匹配的符號,可以加快搜索速度,比如查找qq.com所有host,可以是domain=="qq.com"
- (5)鍾馗之眼(Zoomeye)
鍾馗之眼搜索引擎偏向web應用層面的搜索。地址:https://www.zoomeye.org/
搜索語法
- app:nginx 組件名
- ver:1.0 版本
- os:windows 操作系統
- country:”China” 國家
- city:”hangzhou” 城市
- port:80 端口
- hostname:google 主機名
- site:thief.one 網站域名
- desc:nmask 描述
- keywords:nmask’blog 關鍵詞
- service:ftp 服務類型
- ip:8.8.8.8 ip地址
- cidr:8.8.8.8/24 ip地址段
- (6)郵箱收集
--首先確定郵件服務器本身有沒有什么錯誤配置,沒有禁用VRFY或EXPN命令導致的用戶信息泄露,如果有可以直接把目標的郵件用戶都爆出來,也可以嘗試弱口令。
--收集目標的各類webmail入口。
找目標的各種webmail入口,不一定有,但這也是為了后面一旦拿到密碼嘗試撞庫的手段,如果用的是某種開源WEB郵件程序,也可以嘗試找對應版本的exp。
--提取whois郵箱去搜索引擎搜索,拿到舊密碼可以去社工庫去撞庫。
--直接從目標站點查找郵箱。一般的網站都有的"聯系我們"之類的鏈接或許就是郵箱,當然如果是[email]support@target.com[/email]或者[email]info@target.com[/email]這種郵箱直接忽略,我們需要有互動的郵箱,拿到后都試一試撞一撞庫和搜索引擎跑一跑。
---利用各種工具直接抓取目標郵箱
theharvester:一個比較老的郵箱抓取腳本,主要是從各種搜索引擎抓取郵箱,抓取后的文檔雜亂需要自己篩選分析。
https://github.com/laramies/theHarvester下載或者Kali直接運行。
-d 參數指定目標域
-l 參數指定數量
-b 參數指定端口
-s 指定起始數值
TheHarvester+Hydra可以大量掃描弱口令賬戶。
也可以使用metasploit的 auxiliary/gather/search_email_collector 模塊:
msfconsole打開MSF控制台,輸入use auxiliary/gather/search_email_collector,然后set domain XXmail.com設置目標郵件網站,然后show options顯示搜索來源,exploit
目前使用菜單內的google選項去搜索郵箱需要翻牆,直接用如圖。
兩種方法都可以將結果保存為文件然后使用hydra爆破。
(7)歷史漏洞信息
雖然烏雲關了但是鏡像上面還有大量企業漏洞信息,此外CNVD,seebug等平台
也能查找一些企業歷史漏洞信息。
0X05:人力資源情報收集
(1)招聘信息
用google從招聘網站找到信息再去查找企業信息
通過招聘信息我們找到了公司全稱和負責人構成和郵箱電話等信息。
通過這些信息可以與前面的WHOIS反查結合。
社會工程學方面的知識太繁雜就先不討論了。
參考:
https://wh0ale.github.io/2019/02/22/SRC%E4%B9%8B%E4%BF%A1%E6%81%AF%E6%94%B6%E9%9B%86/
https://www.secpulse.com/archives/74312.html
https://www.freebuf.com/articles/web/190403.html
http://www.davex.pw/2016/07/01/How-To-Fuzz-Sub-Domain/
https://www.freebuf.com/articles/web/179043.html
https://cloud.tencent.com/developer/article/1180157
https://klionsec.github.io/2014/12/22/email-collector/
https://www.secpulse.com/archives/69237.html
https://yq.aliyun.com/articles/366927
https://www.secpulse.com/archives/29475.html
http://www.lijiejie.com/ds_store_exp_ds_store_file_disclosure_exploit/
https://zhuanlan.zhihu.com/p/22161675
https://zhuanlan.zhihu.com/p/22407076
https://www.jianshu.com/p/d2af08e6f8fb
https://blog.csdn.net/zvall/article/details/50115815