一、應(yīng)用場景
1.比如在投票系統(tǒng)開發(fā)中,為了防止刷票,我們需要限制每個 IP 地址只能投票一次
2.當網(wǎng)站受到諸如 DDoS(Distributed Denial of Service,分布式拒絕服務(wù)攻擊)等攻擊時,我們需要快速定位攻擊者 IP
3.在滲透測試過程中,經(jīng)常會碰到網(wǎng)站有 CDN(Content Distribution Network,內(nèi)容交付網(wǎng)絡(luò)),這時我們需要繞過 CDN 查找真實 IP
二、解決方案
服務(wù)端(CDN)
驗證是否具有 CDN
1、使用超級 Ping 網(wǎng)站,查看對應(yīng) IP 地址是否唯一,如果不唯一多半是使用了 CDN ,諸如:
- http://ping.chinaz.com/
- http://ping.aizhan.com/
- http://ce.cloud.#/
2、使用 nslookup 進行檢測,如果返回域名解析對應(yīng)多個 IP 地址多半是使用了 CDN
檢測方式,直接命令行輸入nslookup
,隨后輸入對應(yīng)域名
有 CDN 如下
無 CDN 如下
方法1:查詢歷史 DNS 記錄
查看 IP 與 域名綁定的歷史記錄,可能會存在使用 CDN 前的記錄,相關(guān)查詢網(wǎng)站:
DNS查詢:https://dnsdb.io/zh-cn/
在線域名信息查詢:http://toolbar.netcraft.com/site_report?url=
DNS、IP等查詢:http://viewdns.info/
CDN查詢 IP:https://tools.ipip.net/cdn.php
方法2:查詢子域名
畢竟 CDN 還是不便宜的,所以很多站長可能只會對主站或者流量大的子站點做了 CDN,而很多小站子站點又跟主站在同一臺服務(wù)器或者同一個C段內(nèi),此時就可以通過查詢子域名對應(yīng)的 IP 來輔助查找網(wǎng)站的真實IP。
dnsdb 查詢(https://www.dnsdb.io/)
只需輸入baidu.com type:A就能收集百度的子域名和ip
方法3:網(wǎng)絡(luò)空間搜索引擎
網(wǎng)絡(luò)空間搜索引擎是為了解決個人每次進行滲透測試是都要進行的信息收集過程,通過全網(wǎng)掃描的方式,將基礎(chǔ)數(shù)據(jù)進行格式化存儲,供安全人員按需搜索使用,提升了安全人員的工作效率。
常用的網(wǎng)絡(luò)空間搜索引擎:fofa、shodan、zoomeye、censys
每種搜索引擎都有對應(yīng)的搜索語法,例如 fofa ,只需輸入:title:“網(wǎng)站的title關(guān)鍵字”或者body:“網(wǎng)站的body特征”就可以找出 fofa 收錄的有這些關(guān)鍵字的 ip 域名,獲取能獲取網(wǎng)站的真實 ip,其他搜索引擎語法請看推薦閱讀
方法4:利用 SSL 證書尋找真實原始 IP
假如你在xyz123boot.com上托管了一個服務(wù),原始服務(wù)器IP是136.23.63.44。 而CloudFlare則會為你提供DDoS保護,Web應(yīng)用程序防火墻和其他一些安全服務(wù),以保護你的服務(wù)免受攻擊。為此,你的Web服務(wù)器就必須支持SSL并具有證書,此時CloudFlare與你的服務(wù)器之間的通信,就像你和CloudFlare之間的通信一樣,會被加密(即沒有靈活的SSL存在)。這看起來很安全,但問題是,當你在端口443 https://136.23.63.44:443 上直接連接到IP時,SSL證書就會被暴露。
此時,如果攻擊者掃描0.0.0.0/0,即整個互聯(lián)網(wǎng),他們就可以在端口443上獲取在xyz123boot.com上的有效證書,進而獲取提供給你的Web服務(wù)器IP。
以 Censys 工具為例,我們僅僅需要做的就是把上面用文字描述的搜索詞翻譯成實際的搜索查詢參數(shù),如下
-
xyz123boot.com證書的搜索查詢參數(shù)為:parsed.names:xyz123boot.com
-
只顯示有效證書的查詢參數(shù)為:tags.raw:trusted
-
組合后的搜索參數(shù)為:parsed.names: xyz123boot.com and tags.raw: trusted
但是缺點就是很多非法網(wǎng)站根本沒有 SSL 證書,無法獲取 IP。
方法5:使用國外主機解析域名
國內(nèi)很多 CDN 廠商因為各種原因只做了國內(nèi)的線路,而針對國外的線路可能幾乎沒有,此時我們使用國外的主機直接訪問可能就能獲取到真實IP。
方法6:網(wǎng)站漏洞查找
1)目標敏感文件泄露,例如:phpinfo之類的探針、GitHub信息泄露等。
2)XSS盲打,命令執(zhí)行反彈shell,SSRF等。
3)無論是用社工還是其他手段,拿到了目標網(wǎng)站管理員在CDN的賬號,從而在從CDN的配置中找到網(wǎng)站的真實IP。
方法7:網(wǎng)站郵件訂閱查找
RSS郵件訂閱,很多網(wǎng)站都自帶 sendmail,會發(fā)郵件給我們,此時查看郵件源碼里面就會包含服務(wù)器的真實 IP 了。
方法8:用 Zmap 掃全網(wǎng)
需要找 xiaix.me 網(wǎng)站的真實 IP,我們首先從 apnic 獲取 IP 段,然后使用 Zmap 的 banner-grab 掃描出來 80 端口開放的主機進行 banner 抓取,最后在 http-req 中的 Host 寫 xiaix.me。
方法9:F5 LTM解碼法
當服務(wù)器使用F5 LTM做負載均衡時,通過對set-cookie關(guān)鍵字的解碼真實ip也可被獲取,例如:Set-Cookie: BIGipServerpool_8.29_8030=487098378.24095.0000,先把第一小節(jié)的十進制數(shù)即487098378取出來,然后將其轉(zhuǎn)為十六進制數(shù)1d08880a,接著從后至前,以此取四位數(shù)出來,也就是0a.88.08.1d,最后依次把他們轉(zhuǎn)為十進制數(shù)10.136.8.29,也就是最后的真實ip。
更多方法請看推薦閱讀
客戶端
獲取 IP 方式
在Java中,獲取客戶端IP最直接的方式就是使用request.getRemoteAddr()。這種方式能獲取到連接服務(wù)器的客戶端IP,在中間沒有代理的情況下,的確是最簡單有效的方式。但是目前互聯(lián)網(wǎng)Web應(yīng)用很少會將應(yīng)用服務(wù)器直接對外提供服務(wù),一般都會有一層 Nginx 做反向代理和負載均衡,有的甚至可能有多層代理。在有反向代理的情況下,直接使用request.getRemoteAddr()獲取到的IP地址是Nginx所在服務(wù)器的IP地址,而不是客戶端的 IP。
介紹如何獲取客戶端 IP 之前我們需要了解 Nginx 負載均衡 方式,從協(xié)議上分為如下:
-
七層復雜均衡(HTTP/HTTPS協(xié)議),工作在第七層“應(yīng)用層”。
-
四層負載均衡(TCP/UDP協(xié)議),工作在“網(wǎng)絡(luò)層”和“傳輸層”。
七層復雜均衡
配置 Nginx (支持X-Forwarded-For)
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
$proxy_add_x_forwarded_for會將和Nginx直接連接的客戶端IP追加在請求原有X-Forwarded-For值的右邊。形式如下:
X-Forwarded-For: client1, proxy1, proxy2
X-Forwarded-For包含多個IP地址,每個值通過逗號+空格分開,最左邊(client1)是最原始客戶端的IP地址,中間如果有多層代理,每一層代理會將連接它的客戶端IP追加在X-Forwarded-For右邊。
獲取 IP 代碼段
public String getClientIp(HttpServletRequest request) {
String xff = request.getHeader("X-Forwarded-For");
if (xff == null) {
return request.getRemoteAddr();
} else {
return xff.contains(",") ? xff.split(",")[0] : xff;
}
}
缺點:客戶端可以偽造X-Forwarded-For
一般的客戶端(例如瀏覽器)發(fā)送HTTP請求是沒有X-Forwarded-For頭的,當請求到達第一個代理服務(wù)器時,代理服務(wù)器會加上X-Forwarded-For請求頭,并將值設(shè)為客戶端的IP地址(也就是最左邊第一個值),后面如果還有多個代理,會依次將IP追加到X-Forwarded-For頭最右邊,最終請求到達Web應(yīng)用服務(wù)器,應(yīng)用通過獲取X-Forwarded-For頭取左邊第一個IP即為客戶端真實IP。
但是如果客戶端在發(fā)起請求時,請求頭上帶上一個偽造的X-Forwarded-For,由于后續(xù)每層代理只會追加而不會覆蓋,那么最終到達應(yīng)用服務(wù)器時,獲取的左邊第一個IP地址將會是客戶端偽造的IP。也就是上面的Java代碼中g(shù)etClientIp()方法獲取的IP地址很有可能是偽造的IP地址
解決方案 :配置 Nginx 反向代理(必須是直接對外的 Nginx)
proxy_set_header X-Forwarded-For $remote_addr;
$proxy_add_x_forwarded_for會在原有X-Forwarded-For上追加IP,這就相當于給了偽造X-Forwarded-For的機會。
而$remote_addr是獲取的是直接TCP連接的客戶端IP(類似于Java中的request.getRemoteAddr()),這個是無法偽造的,即使客戶端偽造也會被覆蓋掉,而不是追加。
需要注意的是,如果有多層代理,那么只要在直接對外訪問的Nginx上配置X-Forwarded-For為 r e m o t e a d d r ? ? , ? ? 內(nèi)部層的 N g i n x 還是要配置為 remote_addr**,**內(nèi)部層的Nginx還是要配置為 remotea?ddr??,??內(nèi)部層的Nginx還是要配置為proxy_add_x_forwarded_for,不然內(nèi)部層的Nginx又會覆蓋掉客戶端的真實IP。
四層負載均衡
四層負載均衡基于 TCP/UDP協(xié)議 ,X-Forwarded-For的方式獲取客戶端 IP 方式將會失效,此時可以配置 Nginx 開啟 透傳功能:
stream {
server {
# 開啟透傳
proxy_protocol on ;
}
}
添加這個配置后Nginx建立TCP連接時會主動發(fā)送一段報文,會包含客戶端真實Ip
攜帶客戶端IPv4地址的Proxy Protocol v2二進制頭格式如下所示:
攜帶客戶端IPv6地址的Proxy Protocol v2二進制頭格式如下所示:
補充
代理 IP
- 透明代理
其實即便使用了透明代理IP,還是會發(fā)送真實IP。這種一般是用來突破網(wǎng)絡(luò)瀏覽限制,比如說一般用戶不能隨意訪問的教育網(wǎng),使用代理IP就可以突破的。
- 匿名代理(普通匿名代理和高匿名代理)
普通代理IP是否能查到真實IP。普通代理IP相比于透明代理IP會安全很多,有的服務(wù)器是無法識別真實IP的,但這也不是絕對的,還是會有服務(wù)器識別到使用了代理IP的。
高匿代理IP的可以模擬真正的客戶瀏覽器訪問目標網(wǎng)站,不容易識別出使用了代理IP,會直接認為代理IP就是你用的IP。使用高匿名代理,經(jīng)過高級加密后,在網(wǎng)絡(luò)難以查找信息,但是仍可以從現(xiàn)實查找。想要查真實IP,可以直接從代理IP商那里,通過查看服務(wù)器日志等方式找出他的真實IP地址。
參考文章
http獲取客戶端真實ip的原理及利用X-Forwarded-For偽造客戶端IP漏洞成因及防范 - lovearpu - 博客園 (cnblogs.com)
11種繞過CDN查找真實IP方法 - STARTURN - 博客園 (cnblogs.com)
如何獲取來訪者的真實IP (huaweicloud.com)
通過Proxy Protocol獲取客戶端真實IP(四層監(jiān)聽) (aliyun.com)
解決Nginx代理TCP獲取不到客戶端真實IP的問題
推薦閱讀
滲透測試|玩轉(zhuǎn)網(wǎng)絡(luò)空間搜索引擎 - FreeBuf網(wǎng)絡(luò)安全行業(yè)門戶
技術(shù)|互聯(lián)網(wǎng)掃描器 ZMap 完全手冊 (linux.cn)
F5 BIG-IP LTM 負載均衡器 功能介紹 下篇-阿里云開發(fā)者社區(qū) (aliyun.com)
Nginx 理解四層/七層負載均衡 - Awecoder - 博客園 (cnblogs.com)
用代理IP后還能追蹤到真實IP嗎 - 掘金 (juejin.cn)文章來源:http://www.zghlxwxcb.cn/news/detail-726657.html
本文由博客一文多發(fā)平臺 OpenWrite 發(fā)布!文章來源地址http://www.zghlxwxcb.cn/news/detail-726657.html
到了這里,關(guān)于【全方位解析】如何獲取客戶端/服務(wù)端真實 IP的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!