本篇文章學(xué)習(xí)一下如何獲取真實(shí)ip,隱藏自己的ip,攻擊者如何偽造ip,挖掘出真實(shí)ip。
真實(shí)ip獲取
應(yīng)用層
這里以web為例,以下是一個(gè)簡(jiǎn)單的http服務(wù)器,獲取真實(shí)ip
httpserver.py
from http.server import BaseHTTPRequestHandler, HTTPServer
class MyHTTPRequestHandler(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
# 獲取真實(shí)IP地址
ip = self.headers.get('X-Forwarded-For', self.client_address[0])
# 返回真實(shí)IP地址
self.wfile.write(bytes(ip, 'utf-8'))
def run_server():
host = '0.0.0.0'
port = 8000
server = HTTPServer((host, port), MyHTTPRequestHandler)
print(f'Starting server on {host}:{port}...')
try:
server.serve_forever()
except KeyboardInterrupt:
pass
server.server_close()
print('Server stopped.')
if __name__ == '__main__':
run_server()
服務(wù)器啟動(dòng)代碼
python3 httpserver.py
如果有這個(gè)X-Forwarded-For,就用這個(gè),否則就用client_address[0]
客戶端代碼
import requests
url = 'http://127.0.0.1:8000'
headers = {'X-Forwarded-For': '192.168.1.1'}
response = requests.get(url, headers=headers)
print(response.text)
結(jié)果截圖
網(wǎng)絡(luò)層
網(wǎng)絡(luò)連接
還是上面的代碼,通過網(wǎng)絡(luò)連接獲取真實(shí)ip
不帶header再次發(fā)送
通過網(wǎng)絡(luò)連接獲取真實(shí)ip當(dāng)然很簡(jiǎn)單,也真實(shí),但是往往客戶端與服務(wù)器不是直接連通,中間有LB、CDN等。
雷池WAF就是通過連接獲取請(qǐng)求者源IP的。
TOA
有些產(chǎn)品會(huì)把ip放到TOA(TCP Options),轉(zhuǎn)發(fā)給下游,例如LB(Load Balancer),因此,下游服務(wù)獲取真實(shí)ip時(shí)需要從TOA中獲取
proxy protocol
有v1 v2兩個(gè)版本,都存在偽造問題,且主流LB沒有使用這種方式,僅nginx這種開源的看到了,所以沒有深究,請(qǐng)查看參考。
ip偽造
應(yīng)用層
以WEB為例,修改header即可。
import requests
url = 'http://127.0.0.1:8000'
headers = {'X-Forwarded-For': '8.8.8.8'}
response = requests.get(url, headers=headers)
print(response.text)
截圖
網(wǎng)絡(luò)層
TOA攻擊
一些服務(wù)會(huì)通過TOA來獲取真實(shí)ip,因此,可以通過修改TCP的選項(xiàng)(Options)來隱藏真實(shí)ip。
這里使用的是linux下方式,修改所有包,工具見參考。
首先,我先試驗(yàn)了一下,使用自己宿主機(jī)的服務(wù)器,抓包查看
發(fā)現(xiàn)確實(shí)有修改,Options字段有值,之后找了幾個(gè)查ip的網(wǎng)站,發(fā)現(xiàn)ip138不受影響,另一個(gè)網(wǎng)站是被欺騙了。
curl -A "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11" https://2023.ip138.com | grep 您的IP
curl -A "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11" https://zh-hans.ipshu.com/my_info | grep 下面是你的公開IP
截圖如下:
windows下可以自己寫腳本來進(jìn)行toa的修改
fake_toa.py
from scapy.all import *
import socket
import struct
# 目標(biāo)域名和端口
target_ip = '106.63.19.14'
target_port = 443
# 偽造的源 IP 地址
fake_ip = '111.111.111.222'
# 將偽造的 IP 地址轉(zhuǎn)換為整數(shù)
fake_ip_as_int = struct.unpack("!I", socket.inet_aton(fake_ip))[0]
# 創(chuàng)建自定義的 TCP 選項(xiàng)
option_254 = (254, b'\x00\x50' + struct.pack('!I', fake_ip_as_int))
# 創(chuàng)建 IP 層
ip_layer = IP(dst=target_ip)
# 創(chuàng)建 TCP 層,不添加 TCP 選項(xiàng)
syn = TCP(sport=RandShort(), dport=target_port, flags='S')
# 組合 IP 層和 TCP 層,發(fā)送 SYN 數(shù)據(jù)包
syn_ack = sr1(ip_layer / syn)
# 檢查是否收到 SYN+ACK 數(shù)據(jù)包
if syn_ack[TCP].flags == 'SA':
# 創(chuàng)建 ACK 數(shù)據(jù)包,也不添加 TCP 選項(xiàng)
ack = TCP(sport=syn_ack[TCP].dport, dport=target_port, flags='A', seq=syn_ack[TCP].ack, ack=syn_ack[TCP].seq + 1)
# 發(fā)送 ACK 數(shù)據(jù)包
send(ip_layer / ack)
# 創(chuàng)建 HTTP 請(qǐng)求,只包含 Host 頭部
# http_request = 'GET /ip/local/geo/v1/district HTTP/1.1\r\n' \
# 'Host: qifu-api.baidubce.com\r\n\r\n'
http_request = 'GET / HTTP/1.1\r\n' \
'Host: 2023.ip138.com\r\n\r\n' \
# 創(chuàng)建 HTTP 數(shù)據(jù)包,這次在 TCP 層添加自定義的選項(xiàng)
http_packet = ip_layer / TCP(sport=syn_ack[TCP].dport, dport=target_port, flags='PA', seq=syn_ack[TCP].ack,
ack=syn_ack[TCP].seq + 1, options=[option_254]) / Raw(load=http_request)
# 接收 HTTP 響應(yīng)
http_response = sr1(http_packet)
# 打印 HTTP 響應(yīng)
if http_response:
print(http_response.show())
else:
print('No response')
else:
print('Did not receive SYN+ACK. Received: {}'.format(syn_ack[TCP].flags))
抓包可以看到,確實(shí)添加了Options字段的內(nèi)容
proxy protocol
有v1、v2兩個(gè)版本,都可以偽造,用的不多也沒找到開源工具就沒深究了。
隱藏
代理
比較寬泛,無法列舉全。例如,使用cdn來隱藏自己服務(wù)器的ip,使用“梯子”做中間人來訪問一些你的ip無法訪問的網(wǎng)站,或者開四層、七層代理做轉(zhuǎn)發(fā),使用LB來做負(fù)載均衡的同時(shí)隱藏后端服務(wù)ip等
挖掘
代理
以cdn為例,這里找了一個(gè)博客網(wǎng)站,嘗試獲取真實(shí)ip
多地ping
可以看到使用了騰訊云的CDN
歷史DNS解析記錄
查看 IP 與 域名綁定的歷史記錄,可能會(huì)存在使用 CDN 前的記錄
國(guó)外主機(jī)解析域名
有的網(wǎng)站負(fù)責(zé)人為了省錢,只對(duì)國(guó)內(nèi)使用cdn,于是國(guó)外的流量都直接打到了真實(shí)服務(wù)器上。第一步ping的時(shí)候有了,國(guó)外也是通過cdn的。
網(wǎng)站RSS訂閱
有的網(wǎng)站可以郵件訂閱RSS,發(fā)送郵件的服務(wù)器就是使用網(wǎng)站所在的服務(wù)器,這里該網(wǎng)站沒有此功能,失敗。
網(wǎng)絡(luò)空間搜索引擎
這里使用了zoomeye,我查ip沒有顯示cdn,以為成功了,問了博客作者,還是cdn的ip
總結(jié)
- proxy protocol沒有研究,和TOA差不多,按照協(xié)議發(fā)包就行了,實(shí)現(xiàn)就交給讀者吧。
- TOA的偽造方式還是不錯(cuò)的,非linux下沒有btftools,可以自己寫一個(gè)代理,把瀏覽器的流量轉(zhuǎn)發(fā)到本地代理,代理的功能就是把TOA改一下。
- 一些代理隱藏ip還是不錯(cuò)的,除非網(wǎng)站從開始沒有使用cdn、部分使用cdn,或網(wǎng)站服務(wù)器有其他服務(wù)導(dǎo)致真實(shí)ip發(fā)出包了。該博客作者我也問了,一開始就使用了CDN,也沒有其他子域名、服務(wù),應(yīng)該是無法找到真實(shí)IP了。
該文章在 2024/12/28 12:19:34 編輯過