首页
社区
课程
招聘
[原创]http动态注入(链路劫持)
发表于: 2016-3-17 10:50 9003

[原创]http动态注入(链路劫持)

2016-3-17 10:50
9003
 
struct _ethhdr
{
    unsigned char   h_dest[6];      // [00][01][02][03][04][05] target mac
    unsigned char   h_source[6];    // [06][07][08][09][10][11] source mac
#define _ETH_P_IP                       (0x0800)
#define _ETH_P_ARP                      (0x0806)
    unsigned short  h_proto;        // [12][13]
    // payload...
};
struct _arphdr
{
    unsigned short  ar_hrd;   // [00][01]   format of hardware address
    unsigned short  ar_pro;   // [02][03]   format of protocol address
    unsigned char   ar_hln;   // [04]       length of hardware address
    unsigned char   ar_pln;   // [05]       length of protocol address
#define _ARP_REPLY                      (0x0002)
#define _ARP_REQUEST                    (0x0001)
    unsigned short  ar_op;    // [06][07]   ARP opcode (command)
    // use char[] against package
    unsigned char   ar_sha[6];// [08][09][10][11][12][13] sender hardware mac
    unsigned char   ar_sip[4];// [14][15][16][17]         sender IP address
    unsigned char   ar_tha[6];// [18][19][20][21][22][23] target hardware mac
    unsigned char   ar_tip[4];// [24][25][26][27]         target IP address
};
struct _iphdr
{
#if defined(__LITTLE_ENDIAN_BITFIELD)
    unsigned char   ihl:4,version:4;    // [00] Internet Header Length(ihl)
#elif defined(__BIG_ENDIAN_BITFIELD)    // 4bit ip header max length = 0xf*4 = 60 bytes
    unsigned char   version:4,ihl:4;    // [00]
#else
    #error "check __LITTLE_ENDIAN_BITFIELD / __BIG_ENDIAN_BITFIELD"
#endif
    unsigned char   tos;                // [01]
    unsigned short  tot_len;            // [02][03] ipheader and payload len
    unsigned short  id;                 // [04][05] packet number
    unsigned short  frag_off;           // [06][07]
    unsigned char   ttl;                // [08]     time to live
#define _IPPROTO_TCP                    (0x06)
    unsigned char   protocol;           // [09]
    unsigned short  check;              // [10][11]
    unsigned int    saddr;              // [12][13][14][15] src ip
    unsigned int    daddr;              // [16][17][18][19] dst ip
    // The options start here.             [20]~[59]
    // payload...
};
struct _tcphdr
{
    unsigned short  source;     // [00][01]         source port
    unsigned short  dest;       // [02][03]         target port
    unsigned int    seq;        // [04][05][06][07] send sequence
    unsigned int    ack_seq;    // [08][09][10][11] ack sequence
#if defined(__LITTLE_ENDIAN_BITFIELD)
    unsigned short  res1:4,doff:4,fin:1,syn:1,rst:1,psh:1,ack:1,urg:1,ece:1,cwr:1;
#elif defined(__BIG_ENDIAN_BITFIELD)
    unsigned short  doff:4,res1:4,cwr:1,ece:1,urg:1,ack:1,psh:1,rst:1,syn:1,fin:1;
#else
    #error  "check __LITTLE_ENDIAN_BITFIELD / __BIG_ENDIAN_BITFIELD"
#endif                          // [12][13]         doff tcp hdr len
    unsigned short  window;     // [14][15]
    unsigned short  check;      // [16][17]
    unsigned short  urg_ptr;    // [18][19]
    // The options start here.     [20]~[59] mss,wsopt,sack-premitted,sack,tspot ...
    // payload...
};

  • [I]本测试代码仅供安全测试以及网络协议学习之用,由本代码所造成的一切后果,本人概不负责[/I]
  • 本代码初始为简单学习tcp协议之用,实现劫持功能并非最简单方式
  • 代码写作到后期已经如同搬砖,兴趣索然,由于笔者精力以及知识有限,而且项目学习之中略有感悟,此份代码架构并不优美,结束时会简单描述下我想要达成的那种自我感觉更优美的框架结构
  • 本文尽可能的口述化的描述一些问题,可能很多地方并不会使用一些专业化术语,也有可能描述略有偏差,欢迎指出,如果深入学习推荐读者去学习《tcp/ip协议》三卷
  • 最后一点,我说什么东西都挺墨迹的,读的时候别着急哈

  • client通过发送syn(synchronous 同步)包给server,由于此时并未接收到server发来的数据,所以ack未设置,ack_seq无效。当前发送的seq为本地发送的初始序列号,可理解为随机生成(深入研究还有点规律,此文忽略),携带一些附加选项(同步用附加选项一会细说)
  • server接收到client发送的syn包后,发送自己的syn包给client,由于client已经传输了数据,所以server要告诉client本地已经收到了,ack字段设置,ack_seq=client发送的seq+1(再次强调网络字序问题),表示我们已经收到ack_seq-client.seq = 1数据(并非syn包携带数据为1字节),顺便生成了当前tcp流的初始seq,携带一些同步用附加选项(tcp全双工)
  • client收到server的syn&ack包之后,同样发送个ack给server确认已收到,此时tcp连接已建立。

  • 是目前测试代码中的方式,我们通过双向欺骗,告诉客户端我们是服务器/路由器,告诉服务器/路由器我们是客户端。然后流经过我们之后才会传到对方。
  • 是一种dns污染模式,我们单向欺骗服务端/路由器说我们是客户端,所有去往客户端的流量都被劫持,此时我们做单向路由,把正常的数据都继续转发给客户端。然后到dns解析时我们直接将dns应答结果替换成我们的ip地址,这时这个链接就是一个伪造的服务端连接了。中间人通道成功架起。
  • proxy代理模式,或者说NAT转发模式,这种模式下我们只欺骗客户端说我们是路由器/服务器,客户端的所有流量都在我们的掌控之下,此时我们即是靶机的上层设备了,可以直接模拟路由进行NAT转发操作,也可直接提取链接,然后开启一个服务去正常访问服务器,然后将返回结果再次重新返回给靶机,中途自然你想做什么就做什么了。

  • 通讯一定要加密!最好使用比如openssl这种方式,当然你有精力并且技术足够完全可以自己写,即便不是也最好把关键的地方加密
  • 登录相关一定不要明文传输,最好存储散列摘要,最好自己外面再添加一些别的独有的信息,防止直接从别的社工裤拖散列登陆
  • 收到的数据要校验!自己在自己的数据中插校验散列值,防止被盯上了,一段时间一换方式,不要采用大众都使用的方式

  • 密码一定要不同,即便有很多相同的,也要把重要的几个密码单独设置
  • 不要为了某些原因就去使用不可信的代理服务器,即便使用,记得用隐私模式,不要做登陆相关的操作,防止中间代理服务器嗅探
  • 使用强力防火墙,有些杀毒软件很有意思,默认不开防火墙
  • 公共wifi安全性很低,尽可能不要做任何有关个人重要事情的操作。
  • 自家wifi定期检查,最好设置mac白名单,关wps/qss功能,使用高强度密码,包含各种符号,16位以上
  • 不要使用不可信任的浏览器插件
  • 定期清理缓存,防止缓存投毒
  • [I]本测试代码仅供安全测试以及网络协议学习之用,由本代码所造成的一切后果,本人概不负责[/I]
  • 本代码初始为简单学习tcp协议之用,实现劫持功能并非最简单方式
  • 代码写作到后期已经如同搬砖,兴趣索然,由于笔者精力以及知识有限,而且项目学习之中略有感悟,此份代码架构并不优美,结束时会简单描述下我想要达成的那种自我感觉更优美的框架结构
  • 本文尽可能的口述化的描述一些问题,可能很多地方并不会使用一些专业化术语,也有可能描述略有偏差,欢迎指出,如果深入学习推荐读者去学习《tcp/ip协议》三卷
  • 最后一点,我说什么东西都挺墨迹的,读的时候别着急哈
  • arp攻击
  • 三环路由功能
  • 伪装服务器与客户端
  • 代码残缺,并不一定可运行,仅在本机测试通过
  • 虽采用c写所有核心逻辑,但并未进行移植测试
  • http流报首长度修正
  • chunked 编码插入
  • gzip压缩的数据缓存解压后再进行插入
  • tcp/ip首部校验,判断是否为坏包
  • 系统 : osx 10.11.3

  • [注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

    上传的附件:
    收藏
    免费 1
    支持
    分享
    最新回复 (23)
    雪    币: 110
    活跃值: (127)
    能力值: ( LV5,RANK:60 )
    在线值:
    发帖
    回帖
    粉丝
    2
    代码字体不是等宽的,看起来很难受,截图好了,懒得改了
    2016-3-17 10:52
    0
    雪    币: 689
    活跃值: (422)
    能力值: ( LV11,RANK:190 )
    在线值:
    发帖
    回帖
    粉丝
    3
    赞一个
    2016-3-17 10:56
    0
    雪    币: 215
    活跃值: (51)
    能力值: ( LV3,RANK:20 )
    在线值:
    发帖
    回帖
    粉丝
    4
    毛哥你这种人的存在让我觉得跟你做同学好不安全啊~ 祝找到好工作。代码mark了回头慢慢啃
    2016-3-17 13:20
    0
    雪    币: 110
    活跃值: (127)
    能力值: ( LV5,RANK:60 )
    在线值:
    发帖
    回帖
    粉丝
    5
    我是良民
    2016-3-17 13:24
    0
    雪    币: 112
    活跃值: (12)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    6
    windows下老工具zxarps感觉玩过,可惜太老了,也没关注过新的好工具。楼主的代码架构不错,粗略来讲,个人以为收到的包可以做“提取、解析、回调”这样的处理起来比较方便,至于用什么库,什么类,就各尽其能了。
    另:
    是一种dns污染模式,我们单向欺骗服务端/路由器说我们是客户端,所有去往客户端的流量都被劫持,此时我们做单向路由,把正常的数据都继续转发给客户端。然后到dns解析时我们直接将dns应答结果替换成我们的ip地址,这时这个链接就是一个伪造的服务端连接了。中间人通道成功架起。

    单向欺骗路由器的话,客户端怎么能收到我们主机的数据呢?
    2016-3-17 14:06
    0
    雪    币: 256
    活跃值: (123)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    7
    毛哥你这种人的存在让我觉得跟你做同学好不安全啊
    2016-3-17 14:31
    0
    雪    币: 110
    活跃值: (127)
    能力值: ( LV5,RANK:60 )
    在线值:
    发帖
    回帖
    粉丝
    8
    dns污染,单向欺骗路由导致路由传给客户端的数据均被劫持,我们将劫持到的数据筛选后重新转发给客户端,相当于我们是靶机的接收过滤器,将dns请求的返回地址修改成我们的地址,然后我们的攻击机做流氓代理服务器就好了。当然这种情况就不能把流量全部劫持了。
    2016-3-17 15:09
    0
    雪    币: 112
    活跃值: (12)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    9
    楼主,我的问题是,如果只是欺骗路由器,即使我们转包给客户端,客户端也会丢弃啊。
    2016-3-17 16:14
    0
    雪    币: 110
    活跃值: (127)
    能力值: ( LV5,RANK:60 )
    在线值:
    发帖
    回帖
    粉丝
    10
    不会丢弃,我尝试过单向劫持,而且系统本身只判断ip地址,不判断来源以太网头。
    比如一下这种情况
    cli: mac 33:33:33:33:33:33 ip 192.168.1.3
    us: mac 22:22:22:22:22:22 ip 192.168.1.2
    ser: mac 11:11:11:11:11:11 ip 192.168.1.1

    单向欺骗
    us -> ser  arp reply  192.168.1.3 is at 22:22:22:22:22:22
    单向转发
    ser->us tcp from 11:11:11:11:11:11 to 22:22:22:22:22:22(192.168.1.3)
    us->cli tcp from 22:22:22:22:22:22 to 33:33:33:33:33:33(192.168.1.3)

    流本身不作改动,cli正常接收,只是如果抓包的话可以看出发给路由的包但返回的包不是从路由返回的,此处转发是为了维持cli的网络正常通讯。单向arp欺骗主要为了做dns污染,修改dns响应来达成中间人
    2016-3-17 17:04
    0
    雪    币: 112
    活跃值: (12)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    11
    感谢楼主细心讲解,回头实验验证下。
    2016-3-17 17:19
    0
    雪    币: 205
    活跃值: (10)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    12
    感谢分享 正在看代码
    2016-5-16 23:48
    0
    雪    币: 0
    活跃值: (12)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    13
    大神,咋玩这个啊,看不懂啊~
    2016-7-19 11:19
    0
    雪    币: 2044
    活跃值: (237)
    能力值: ( LV3,RANK:30 )
    在线值:
    发帖
    回帖
    粉丝
    14
    mark....
    2016-7-19 19:43
    0
    雪    币: 1839
    活跃值: (295)
    能力值: ( LV9,RANK:370 )
    在线值:
    发帖
    回帖
    粉丝
    15
    顶一下。。。。。
    2016-7-22 17:03
    0
    雪    币: 230
    活跃值: (10)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    16
    毛哥你这种人的存在让我觉得跟你做同学好不安全....
    2016-7-27 09:22
    0
    雪    币: 0
    活跃值: (10)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    17
    下来看看先
    2016-8-22 15:10
    0
    雪    币: 235
    活跃值: (12)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    18
    感谢分享 正在看代码
    2016-8-24 09:36
    0
    雪    币: 224
    活跃值: (11)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    19
    厉害厉害
    2018-4-3 00:11
    0
    雪    币: 220
    能力值: ( LV1,RANK:0 )
    在线值:
    发帖
    回帖
    粉丝
    20
    作者可以尝试使用Python的scapy库试试,我测试过这种劫持,效果还不错。
    2020-1-11 12:49
    1
    雪    币: 110
    活跃值: (127)
    能力值: ( LV5,RANK:60 )
    在线值:
    发帖
    回帖
    粉丝
    22
    工具化实用版
    https://github.com/Erriy/blog/blob/master/mitm/mitm.md
    2020-3-13 11:06
    0
    雪    币: 212
    活跃值: (15)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    23
    这个只能攻击非SSL站点吧?  如果中间人SSL握手就要失败的。
    2020-5-26 21:06
    0
    雪    币: 20
    能力值: ( LV1,RANK:0 )
    在线值:
    发帖
    回帖
    粉丝
    24
    我在这儿留下个评论,是不是就意味着被盯上了
    2020-6-22 10:48
    0
    游客
    登录 | 注册 方可回帖
    返回
    //