CVE漏洞中文网

0DayBank一个专门收集整理全球互联网漏洞的公开发布网站
  1. 首页
  2. 百科
  3. 正文

raw039

2017年5月24日 762点热度 0人点赞 0条评论

raw039

  • 首页
  • 分类阅读
  • 文库
  • 专栏
  • 公开课
  • 商城
  • 漏洞盒子
注册 | 登录
投稿

使用Python进行TCP数据包注入(伪造)

moquns2014-08-19+7共422594人围观 ,发现 18 个不明物体网络安全

数据包注入是对已经建立的网络连接通过构建任意协议(TCP…UDP…)然后用原始套接字发送的方式进行妨碍的过程,这种方法被广泛使用在网络渗透测试中,比如DDOS,端口扫描等。

一个数据包由IP头部信息、TCP/UDP头部信息和数据构成:

Packet = IP Header + TCP/UDP Header + Data

大多数操作系统的socket API都支持包注入(尤其是基于Berkeley Sockets的),微软在windows xp之后为了避免包嗅探限制了原始套接字的能力。这篇文章只适用于UNIX/类UNIX系统。

TCP协议被广泛运用于互联网上的数据传输,它是一种面向连接(连接导向)的、可靠的、基于IP的传输层协议。

TCP的首部格式:

0                   1                   2                   3  
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          Source Port          |       Destination Port        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Sequence Number                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Acknowledgment Number                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Data |           |U|A|P|R|S|F|                               |
| Offset| Reserved  |R|C|S|S|Y|I|            Window             |
|       |           |G|K|H|T|N|N|                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           Checksum            |         Urgent Pointer        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Options                    |    Padding    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                             data                              |
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-

—Source Port是源端口,16位。

—Destination Port是目的端口,16位。

—Sequence Number是发送数据包中的第一个字节的序列号,32位。

—Acknowledgment Number是确认序列号,32位。

—Data Offset是数据偏移,4位,该字段的值是TCP首部(包括选项)长度乘以4。

—标志位: 6位,URG表示Urgent Pointer字段有意义:

ACK表示Acknowledgment Number字段有意义

PSH表示Push功能,RST表示复位TCP连接

SYN表示SYN报文(在建立TCP连接的时候使用)

FIN表示没有数据需要发送了(在关闭TCP连接的时候使用)

Window表示接收缓冲区的空闲空间,16位,用来告诉TCP连接对端自己能够接收的最大数据长度。

—Checksum是校验和,16位。

—Urgent Pointers是紧急指针,16位,只有URG标志位被设置时该字段才有意义,表示紧急数据相对序列号(Sequence Number字段的值)的偏移。

更多TCP协议的详细信息可以在网上轻易找到,在这里不再赘述。

为了建立一个可以自己构造数据的包,我们使用"SOCK_RAW"这种socket格式,使用"IPPROTO_RAW"协议,它会告诉系统我们将提供网络层和传输层。

s = socket.socket(socket.AF_INET,socket.SOCK_RAW,)

通过这个简单的类,我们可以进行IP头部信息构造

class ip(object):
    def __init__(self, source, destination):
        self.version = 4
        self.ihl = 5 # Internet Header Length
        self.tos = 0 # Type of Service
        self.tl = 0 # total length will be filled by kernel
        self.id = 54321
        self.flags = 0 # More fragments
        self.offset = 0
        self.ttl = 255
        self.protocol = socket.IPPROTO_TCP
        self.checksum = 0 # will be filled by kernel
        self.source = socket.inet_aton(source)
        self.destination = socket.inet_aton(destination)
    def pack(self):
        ver_ihl = (self.version << 4) + self.ihl
        flags_offset = (self.flags << 13) + self.offset
        ip_header = struct.pack("!BBHHHBBH4s4s",
                    ver_ihl,
                    self.tos,
                    self.tl,
                    self.id,
                    flags_offset,
                    self.ttl,
                    self.protocol,
                    self.checksum,
                    self.source,
                    self.destination)

"pack"方法会对IP头部元素进行打包并返回它

ipobj = ip("127.0.0.1", "127.0.0.2") # Creating an ip object instancei 
pobj.source = "localhost" # Changing IP element value

构造TCP头部信息

TCP类允许我们轻易地操作TCP头部元素并打包它们

class tcp(object):
    def __init__(self, srcp, dstp):
        self.srcp = srcp
        self.dstp = dstp
        self.seqn = 0
        self.ackn = 0
        self.offset = 5 # Data offset: 5x4 = 20 bytes
        self.reserved = 0
        self.urg = 0
        self.ack = 0
        self.psh = 1
        self.rst = 0
        self.syn = 0
        self.fin = 0
        self.window = socket.htons(5840)
        self.checksum = 0
        self.urgp = 0
        self.payload = ""
    def pack(self, source, destination):
        data_offset = (self.offset << 4) + 0
        flags = self.fin + (self.syn << 1) + (self.rst << 2) + (self.psh << 3) + (self.ack << 4) + (self.urg << 5)
        tcp_header = struct.pack(&#039;!HHLLBBHHH&#039;,
                     self.srcp,
                     self.dstp,
                     self.seqn,
                     self.ackn,
                     data_offset,
                     flags, 
                     self.window,
                     self.checksum,
                     self.urgp)
        #pseudo header fields
        source_ip = source
        destination_ip = destination
        reserved = 0
        protocol = socket.IPPROTO_TCP
        total_length = len(tcp_header) + len(self.payload)
        # Pseudo header
        psh = struct.pack("!4s4sBBH",
              source_ip,
              destination_ip,
              reserved,
              protocol,
              total_length)
        psh = psh + tcp_header + self.payload
        tcp_checksum = checksum(psh)
        tcp_header = struct.pack("!HHLLBBH",
                  self.srcp,
                  self.dstp,
                  self.seqn,
                  self.ackn,
                  data_offset,
                  flags,
                  self.window)
        tcp_header+= struct.pack(&#039;H&#039;, tcp_checksum) + struct.pack(&#039;!H&#039;, self.urgp)

我们知道,TCP协议是一种面向连接(连接导向)的、可靠的、基于IP的传输层协议,提供一种面向连接的、可靠的字节流服务,面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据包之前必须先建立一个TCP连接。

伪造的头部信息有五个不同的区域且包含了source ip和destination ip

0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          Source IP address                    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Destination IP address                 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Reserved  |   Protocol    |          Total Length         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
•Source IP address (32 bits): 发送者的IP地址
•Destination IP address (32 bits): 接受者的IP地址
•Reserved (8 bits): 清零
•Protocol (8 bits): 传输协议(6为TCP, 17为UDP)

在TCP头部校验计算中,校验和字段必须清零。一旦值被计算出,在发送包之前必须插入字段中。

构造头部字段

source_ip = source
destination_ip = destination
reserved = 0
protocol = socket.IPPROTO_TCP

打包伪造的头部并且将它插入TCP头部和数据中:

# 伪造头部
psh = struct.pack("!4s4sBBH",
              source_ip,
              destination_ip,
              reserved,
              protocol,
              total_length)
psh = psh + tcp_header + self.payload

校验函数:

def checksum(data):
    s = 0
    n = len(data) % 2
    for i in range(0, len(data)-n, 2):
        s+= ord(data[i]) + (ord(data[i+1]) << 8)
    if n:
        s+= ord(data[i+1])
    while (s >> 16):
        print("s >> 16: ", s >> 16)
        s = (s & 0xFFFF) + (s >> 16)
    print("sum:", s)
    s = ~s & 0xffff

一个小列子:

s = socket.socket(socket.AF_INET,
                  socket.SOCK_RAW,
                  socket.IPPROTO_RAW)
src_host = "10.0.2.15"
dest_host = socket.gethostbyname("www.reddit.com")
data = "TEST!!"
# IP Header
ipobj = ip(src_host, dest_host)
iph = ip_object.pack()
# TCP Header
tcpobj = tcp(1234, 80)
tcpobj.data_length = len(data)  # Used in pseudo header
tcph = tcpobj.pack(ipobj.source,
                   ipobj.destination)
# Injection
packet = iph + tcph + data
Pinject.py
Running the script:
python pinject.py --src=10.0.2.15 --dst=www.reddit.com
[+] Local Machine: 10.0.2.15
[+] Remote Machine: 198.41.209.142
[+] Raw scoket created
[+] Data to inject: TEST!!
[+] Constructing IP Header
[+] Constructing TCP Header

wireshark的截图:

项目地址:https://github.com/offensive-python/Pinject

moquns6 篇文章等级: 3级
|
|
  • 上一篇:绿盟科技威胁分析报告 ——DDoS兵器谱2014Q2版
  • 下一篇:一张图告诉你如何对抗DDoS攻击

这些评论亮了

  • -_-回复
    是不是有一个叫scapy的东西跟这个类似
    )14(亮了
发表评论

已有 18 条评论

  • 浩天寰宇 (3级)猴子是我请来的逗比~ 2014-08-19回复1楼

    消灭零回复

    亮了(5)
  • evilknight (2级) 2014-08-19回复2楼

    消灭壹回复

    亮了(3)
  • -_- 2014-08-19回复3楼

    是不是有一个叫scapy的东西跟这个类似

    亮了(14)
  • 嘿嘿 2014-08-19回复4楼

    消灭0马克

    亮了(3)
  • Yes →_→terday (1级) 2014-08-19回复5楼

    学习下 :idea:

    亮了(4)
  • test 2014-08-19回复6楼

    漏点。。。

    亮了(3)
  • RickGray (3级) 2014-08-19回复7楼

    不错,python raw_socket资料好像挺少

    亮了(3)
  • xxxt (1级) 2014-08-19回复8楼

    这不是语法错误吗…. 虽然我关注的不是重点… dpkt 的构造方法要比这省便的多… …

    # IP Header
    ipobj = ip(src_host, dest_host)
    iph = ip_object.pack()

    亮了(2)
  • sincoder 2014-08-19回复9楼

    TCP 数据包注入 C 实现 https://github.com/sincoder/sinarp

    亮了(1)
  • Aurora (4级) 2014-08-20回复10楼

    果然看不懂= =

    亮了(0)
  • whg 2014-08-21回复11楼

    有种东西叫scapy …

    亮了(0)
  • jordan18 (1级) 2015-02-26回复12楼

    学习中……

    亮了(0)
  • 一块腹肌 (1级) 2015-04-18回复13楼

    用scapy要方便的多吧

    亮了(0)
  • nxl (1级) 2015-08-16回复14楼

    楼主,请问通过packet = iph + tcph + data这一句得到了数据包后,如何将这个数据包发送到网上啊

    亮了(2)
    • 红茶 (1级) 2016-03-09回复

      @ nxl  不光要发出去,还要“注入”到已有的TCP链接中才算是注入吧

      亮了(0)
  • zzkin 2015-08-26回复15楼

    伪造的IP无法通过机房出去,应该是机房有源IP过滤吧?

    亮了(0)
  • hunter 2016-03-03回复16楼

    构造的packet我用sendto()发送出去,但是recvfrom()却一直收不到数据,端口是开着的情况下都不能,一直卡在那里。换成非阻塞的话,所有的端口都是关闭的,明显不行,求解答

    亮了(0)
  • 红茶 (1级) 2016-03-09回复17楼

    这篇文章,将的是怎么构造TCP数据吧,但要想完成TCP注入工作,还有非常重要的一步:怎么用你构造的数据替换系统正常发送的tcp数据而不引起协议错误?
    构造TCP数据,方法很多,可以用winpcap直接构造,不需要这么多麻烦了,但怎么替换呢?

    亮了(3)

必须您当前尚未登录。登陆?注册

必须(保密)

表情插图

取消

moquns

这家伙太懒,还未填写个人描述!

6 篇文章6 条评论

相关阅读

  • Python爬虫开发(四):动态加载页面的解决方案与爬虫代理
  • 实例讲解如何利用Python编写Exploit
  • 技术分享:如何用Python和PyInstaller编写Windows恶意代码
  • Kitty:Python语言编写的Fuzzing框架
  • Deepviz SDK 的 Python 接口浅析

特别推荐

关注我们 分享每日精选文章

不容错过

  • 开源的理念做安全:FreeBuf与HackerOne COO王宁对谈安全众测欧阳洋葱2017-04-25
  • 一款猥琐的PHP后门分析360网站卫士2014-03-19
  • 混搭新式:社工+powershell,轻松畅游主机东二门陈冠希2016-05-30
  • 这个19KB的“成人影集”到底做了什么?expsky2016-11-03

FREEBUF

  • 免责声明
  • 关于我们
  • 加入我们

广告及服务

  • 寻求报道
  • 广告合作
  • 联系我们
  • 友情链接

关注我们

  • 官方微信
  • 新浪微博
  • 腾讯微博
  • Twitter

赞助商

Copyright © 2013 WWW.FREEBUF.COM All Rights Reserved 沪ICP备13033796号

css.php

正在加载中...

0daybank

标签: 暂无
最后更新:2017年5月24日

小助手

这个人很懒,什么都没留下

点赞
< 上一篇
下一篇 >

文章评论

您需要 登录 之后才可以评论

COPYRIGHT © 2024 www.pdr.cn CVE漏洞中文网. ALL RIGHTS RESERVED.

鲁ICP备2022031030号

联系邮箱:wpbgssyubnmsxxxkkk@proton.me