betway必威官网注册 > 科学 > 老板都乐疯了,快速上手

原标题:老板都乐疯了,快速上手

浏览次数:58 时间:2019-09-16

原标题:基于Redis实现分布式锁-Redisson使用及源码分析【面试+工作】

原标题:不花一分钱,10家分公司可以随时随地开会,老板都乐疯了!

原标题:cobalt strike 快速上手 [ 一 ]

基于Redis实现分布式锁-Redisson使用及源码分析【面试+工作】

今年年初,随锐科技旗下瞩目视频通信云服务进行重大战略调整,推出了全新的“瞩目基础会议室”,支持用户使用瞩目免费召开最大10方的多人视频云会议。

0x01 关于 Cobalt Strike

在分布式场景下,有很多种情况都需要实现最终一致性。在设计远程上下文的领域事件的时候,为了保证最终一致性,在通过领域事件进行通讯的方式中,可以共享存储(领域模型和消息的持久化数据源),或者做全局XA事务(两阶段提交,数据源可分开),也可以借助消息中间件(消费者处理需要能幂等)。通过Observer模式来发布领域事件可以提供很好的高并发性能,并且事件存储也能追溯更小粒度的事件数据,使各个应用系统拥有更好的自治性。

瞩目基础会议室让中小型公司可以“免费吃到天上掉下的科技馅饼”,帮助他们以最少的成本快速解决跨区域沟通的难题。

一款非常优秀的后渗透平台 [ 谁用谁知道,嘿嘿……说不好用的唯一原因,可能就是很多用法还没有被自己挖掘出来,因为不会用,所以,才会感觉不好用 ]

本文主要探讨另外一种实现分布式最终一致性的解决方案——采用分布式锁。基于分布式锁的解决方案,比如zookeeper,redis都是相较于持久化(如利用InnoDB行锁,或事务,或version乐观锁)方案提供了高可用性,并且支持丰富化的使用场景。 本文通过Java版本的redis分布式锁开源框架——Redisson来解析一下实现分布式锁的思路。

图片 1

工具基于java,大部分功能在改进的基础上还是相对比较实用的,非常适合团队间协同作战

分布式锁的使用场景

视频沟通将成为企业管理效率提升利器

更多详情请自行参考官网,这里就不啰嗦了,以下全部简称'cs'

如果是不跨限界上下文的情况,跟本地领域服务相关的数据一致性,尽量还是用事务来保证。但也有些无法用事务或者乐观锁来处理的情况,这些情况大多是对于一个共享型的数据源,有并发写操作的场景,但又不是对于单一领域的操作。

创业初期,小公司通讯基本靠吼,面对面就解决问题了。但是随着公司不断发展,分支机构、合作伙伴遍布全球各地,沟通日渐不便,决策与执行的效率都将受到限制。

0x02 基础环境简介:

举个例子,还是用租书来比喻,A和B两个人都来租书,在查看图书的时候,发现自己想要看的书《大设计》库存仅剩一本。书店系统中,书作为一种商品,是在商品系统中,以Item表示出租商品的领域模型,同时每一笔交易都会产生一个订单,Order是在订单系统(交易限界上下文)中的领域模型。这里假设先不考虑跨系统通信的问题,也暂时不考虑支付环节,但是我们需要保证A,B两个人不会都对于《大设计》产生订单就可以,也就是其中一个人是可以成功下单,另外一个人只要提示库存已没即可。此时,书的库存就是一种共享的分布式资源,下订单,减库存就是一个需要保证一致性的写操作。但又因为两个操作不能在同一个本地事务,或者说,不共享持久化的数据源的情况,这时候就可以考虑用分布式锁来实现。本例子中,就需要对于共享资源——书的库存进行加锁,至于锁的key可以结合领域模型的唯一标识,如itemId,以及操作类型(如操作类型是RENT的)设计一个待加锁的资源标识。当然,这里还有一个并发性能的问题,如果是个库存很多的秒杀类型的业务,那么就不能单纯在itemId 加类型加锁,还需要设计排队队列以及合理的调度算法,防止超卖等等,那些就是题外话了。本文只是将这个场景作为一个切入点,具体怎么设计锁,什么场景用还要结合业务。

视频云会议作为新时代的沟通桥梁,其“面对面”的可视化远程交流方式,改变了电话、e-mail、异地出差等传统沟通模式带来的不便,通过其远程会面、资料共享、屏幕共享、远程互动等功能为企业商务沟通带来身临其境的感受。

kali 实际控制端 ip:192.168.1.144

领域服务概念

我们可以预见,通过视频云会议来解决跨地区沟通,将成为这个时代背景下所有企业的唯一选择,其接近零成本,近乎面对面沟通效果,便捷数据共享及会议管理功能,帮助企业节约时间、资源和差旅费用等沟通成本,大大提高工作效率。

ubuntu 16.04 自己公网的vps ip:53.3.3.6

借用《Implementing Domain-driven Design》里面的对于领域服务的定义。领域的某个操作过程或转换过程不是实体或值对象的职责时,应该将操作放在一个单独的接口中,即领域服务,并且要和通用语言保持一致。这里的非实体或值对象操作会有很多种情况,比如某个操作需要对多个领域对象操作,输出一个值对象。在分层的架构中,有点类似于Manager。但是如果过渡抽象manager就会出现贫血,所以还需要确保领域服务是无状态的,并且做好和贫血模型的权衡。可能大多数情况,领域服务的参数都是比实际的领域模型小的,只有些关键属性的值对象。如果服务只操作领域的实体或值对象,则可以考虑下放到domain model中操作。

图片 2

win2008R2 目标机器 ip:192.168.1.191

前面提到了Manager,但是很多应用中都会把Manager抽象成接口的形式,但大多数情况其实完全没有必要,可以通过服务Factory的方式解耦,或者用Spring的@Service注解来注入真正的服务实现类。对于一些简单的领域操作,还可以抽象一个迷你层,这个迷你层也可以称作是领域服务,只不过是无状态,无事务,安全的一个抽象层。

“花样频出”, 旨在打通客户心里的“最后一公里”!

centos6.9 已控肉鸡 ip:192.168.1.199

领域事件其实也可以归纳为领域服务,不过领域服务的事件是幂等的。因为领域服务是无事务的,所以事件也是无副作用的,这样在处理聚合依赖的时候,需要保证他们的最终一致性。

近年来,商务视频会议系统已经非常成熟,然而,大部分中小企业却依旧停留在面对面开会的传统模式上。

win7cn 另一台肉鸡 ip:192.168.1.123

{领域事件

究其原因,主要有以下两方面:一、部分厂家提供的视频会议方案投入费用过高;二、部分厂家提供的视频会议系统需采购诸多软件、硬件,且会议系统操作复杂,甚至需要专门的IT人员支持。所以,视频会议离真正走进企业的心坎里,还差着难以逾越的“一公里” 。

0x03 先来快速预览cs最基本的一些模块具体用途:

将领域中发生的活动建模成一系列的离散事件,每个事件都用领域对象来表示。简而言之,领域事件就是领域中发生的事件。还拿租书为例,一本书被借走了,那么需要产生一个借书订单,并且对于租书者来说,需要能查看自己租书的列表和书籍详情,同时这本书也需要被标记为不能再借出的状态(因为已经被借走了)。这里面bookRent就可以作为一个领域事件来发出。

随锐瞩目一直在如何使视频会议沟通更加简单、高效、低成本的道路上进行着积极的探索,真正满足并服务于成千上万的企业客户。

团队服务器[teamserver]

事件的聚合

2015年瞩目上线初始便推出 2、3方免费使用帐号,产品上线后半年内推出瞩目快车服务,即用户可自定义购买通话时长及方数,真正实现按需购买。

主要是为了方便一个渗透团队内部能够及时共享所有成员的所有渗透信息,加强成员间的交流协作,以此提高渗透效率

对于上述的事件模型,我们可以创建具有聚合特性的领域事件。这里我们可以把这个事件本身建模成一个聚合(BookRentEvent 对象),并且有自己的持久化方式。唯一标识可以由一组属性决定,在客户方(Client)调用领域服务的时候创建这个领域事件{new bookRentEvent())},并添加到资源库中,然后再通过消息的方式进行发布。发布成功后再回调更新时间状态。但这里需要注意,消息发布最好和事件资源库在相同的上下文,或共享数据源,这样就可以保证事件的成功提交,在不同上下文系统,就需要做全局事务来保证。而唯一标识在这里的作用就是为了防止消息重发或者重复处理。所以订阅方需要检查重复消息,并且忽略。如果是本地上下文的事件,最好提供equals和hashcode 实现。

图片 3

也就是说,正常情况下一个团队只需要起一个团队服务器即可,团队中的所有成员只需要拿着自己的cs客户端登录到团体服务器就能轻松实现协同作战

结合刚才的例子,在书籍管理上下文中,书被借走了,那么书籍唯一表示和书的状态(Rent被借出)就可以标识一个事件。这个事件中需要有借书人的信息(如id,nick等),那么在持久化这个事件后,可以post一个Eventbus的本地消息,由用户书籍领域服务监听,更新用户书籍列表等一系列操作。然后再Callback到事件源,更新事件状态,处理成功。如果需要处理事件都在本地上下文,处理起来并不麻烦。

2018年初,瞩目推出10方免费视频通信服务——瞩目基础会议室真正实现“0门槛”入会,最简化操作,轻松、简单的将视频会议系统纳入到企业的管理架构中,最终转化为企业快速发展的核动力系统,这也是随锐瞩目的初心。

当然,实际中可能为了尽可能久的维持住目标机器权限,还会习惯性的多开几个团队服务器,防止出现意外情况

发布领域事件

据介绍,瞩目基础会议室支持最大十方免费视频会议,可极大满足中、小规模的企业远程沟通需求,真正一步到位解决企业在快速发展中所遇到的沟通障碍,助力企业在信息化发展中实现新的突破。

另外,团体服务器最好运行在linux平台上[本次演示所用的团队服务器系统为ubuntu 16.04]

领域事件的发布可以用Observer模式。在本地上下文,也要尽量减少对基础设施或者消息中间件暴露领域模型,所以,需要将本地模型(领域模型)封装成事件的聚合。比如我们不能直接发布一个BookRent聚合的事件,而是一个BookRentEvent,这个Event对象,还会持有一些事件特有的属性,比如可能根据需要,会有occurTime(发生时间),isConsumed(是否已经被处理)。事件发布时,所有订阅方都会同步收到通知。领域事件的主要组件就是publisher和subscriber了。

图片 4

# ./teamserver 团队服务器ip 设置一个团队服务器密码[别人要用这个密码才能连进来] 配置文件[一般默认即可] [YYYY-MM-DD]

发送者

同时,瞩目支持各种常用的智能终端设备及操作系统,无论身处办公室、家中,还是在路上,只需通过手机、Pad、电脑,就可随时随地享受高效、便捷的商务沟通体验。

# ./teamserver 53.3.3.6 klion

发送者本身并不表达一种领域概念,而是作为一种服务的形态。无论用什么技术方式实现,用什么框架,处理事件发送的思路也都可能不尽相同。比如,在web应用中,可以在启动应用的时候处理订阅者向发送者的事件注册(避免注册和处理发送的线程同步问题)。比如可以将关注的事件registe到本地的一个ThreadLocal的publisher List中。应用启动完成后,开始处理领域事件的时候,就可以发送一个事件的聚合。这个事件的聚合是一个事件对象,而不是领域模型中的实体,因为我们要暴露需要暴露的事件给其他上下文,而不是暴露完整的领域对象。如果使用EventBus,我们可以在post的时候,封装一个事件作为参数。

此外,瞩目拥有极强的网络自适应能力,并在业内率先通过“可信云”认证。根据客户真实使用反馈,瞩目在网络带宽仅300K情况下视频通话、共享文档、图片传输等依然稳定流畅,大大超越同类产品。

图片 5

订阅者

瞩目可实现随时动态扩容,客户只需一键开通,即可瞬间拥有最高1万方并发能力。许多公司发展快,时常遇到会议室方数不够用的情况。瞩目允许客户根据自身的需要灵活调整会议室容量,不但大幅节约前期投入成本,还能快速适应企业不同阶段发展情况。

客户端[cobaltstrike]

事件的订阅者可以作为应用服务的一个独立的组件。因为应用服务是在领域逻辑的外层,如果是纯粹的事件驱动,那么订阅者作为一种应用服务,也可以定位成具有单一职责的,负责事件存储的应用服务组件。

图片 6

为了更好的说明效果,此处就分别模拟两个不同的客户端同时登陆到同一台团队服务器中,首先,先在本机运行客户端尝试登陆到团队器,客户端启动以后会提示你输入团队服务器的ip,端口和密码,用户名可随意

分布式领域事件

多年来,随锐科技一直秉承“世界沟通,因随锐而大不同”的理念,不断在视频通信行业领域自我超越,创造新的奇迹。我们坚信,随锐瞩目视频云会议免费版本,必将在整个跨地域沟通高端服务业内掀起一场革命,也必将有更多的中小企业通过瞩目,成为随锐科技的合作伙伴,共同在信息化时代向新的征程迈进。

# ./cobaltstrike

在处理分布式事件中,最重要也是最难处理的就是一致性。消息的延迟,处理的不幂等就会影响领域模型状态的准确性和事件的处理。但是我们在系统间交互的过程中,可以用一些技术方式来达到最终一致性。这其中可能就需要进行事件模型的持久化。处理方式可以

瞩目是谁

图片 7

1. 领域模型和消息设施共享持久存储的数据源。这种需要事件作为一种本地事件模型存储在和本地领域模型的同一个数据库中。这样保证了本地事务的一致,性能较好,但是不能和其他上下文共享持久化存储。

视频开会,高效沟通神器

接着,再到另一台kali机器上打开客户端登陆登录到同一团队服务器,最终实现的效果如下,团队成员可以通过event相互沟通,也可通过event清晰看到团队中的其它成员在什么时间都干了些什么,非常详细直观:

2. 全局XA事务(两阶段提交)来控制。模型和消息的持久化可以分开,但是全局事务性能差,成本高。

随锐瞩目的视频通信云+移动设计,独创的移动视频会议体验,使用户只需在电脑、智能手机或平板电脑上安装瞩目客户端即可发起全球多人视频会议,真正实现在任何时间,任何地点,任何设备间畅快沟通。

# ./cobaltstrike

3. 在领域模型的持久化存储中,单独一块存储区域(单独一张事件表)来存储领域事件。也就是做本地的EventStore。但是需要有一个发布事件的消息机制,消息事件是完全私有的。消息的发送可以交给消息中间件来处理。如果可以的话,还可以将时间存储作为Rest资源。事件就可以以一种存档日志的形式对外发布事件(消息队列,通过消息设施或者中间件发送RabitMQ,MetaQ等)。这样还保证了时间的可追溯性。

随锐瞩目不仅提供流畅的语音,清晰的视频图像,同时也提供文档共享、屏幕共享、电子白板与远程协作等视频云会议功能,利用网络让不同地方的工作人员通过音视频实时“面对面”交流沟通。

图片 8

我们使用事件来解耦,是为了考虑尽量避免RPC,简化系统依赖,减少外部服务不可用对系统模型带来的状态影响。所以领域事件强调的是高度自治,但是也需要斟酌,通过事件处理的情况必须是容许延时的,并且消息的接收方需要是一个幂等接收器(可以自幂等,或者对于重复消息的拒绝处理),因为消息是可能重复发送的。}

目前随锐瞩目已为中国石油、用友集团、方正集团、得力文具等众多企业提供视频云会议系统,提升企业沟通效率。未来,随锐科技将以最先进的技术、最完善的服务和全球领先的行业经验,助力企业腾飞。

图片 9

需要解决的问题

电脑端用户可通过官网()

使用cs的各种监听器

分布式的思路和线程同步锁ReentrantLock的思路是一样的。我们也要考虑如以下几个问题:

责任编辑:

其实,监听器的作用很简单,主要是为了接受payload回传的各类数据,

  • 死锁的情况。复杂的网络环境下,当加锁成功,后续操作正在处理时,获得锁的节点忽然宕机,无法释放锁的情况。如A在Node1 节点申请到了锁资源,但是Node1宕机,锁一直无法释放,订单没有生成,但是其他用户将无法申请到锁资源。
  • 锁的性能效率。分布式锁不能成为性能瓶颈或者单点故障不能导致业务异常。
  • 如果关键业务,可能需要重入场景,是否设计成可重入锁。这个可以参考下在多线程的情况下,比如ReentrantLock就是一种可重入锁,其内部又提供了公平锁和非公平锁两种实现和应用,本文不继续探讨。带着以上问题,和场景,沿着下文,来一一找到解决方案。

比如,我们的payload在目标机器执行以后,会回连到监听器然后下载执行真正的shellcode代码,其实跟msf中handler的作用基本是一致的

基于Redis实现 Redis 命令

在cs中的监听器有两种,一种是beacon,另一种是foreign

在Redisson介绍前,回顾下Redis的命令,以及不通过任何开源框架,可以基于redis怎么设计一个分布式锁。基于不同应用系统实现的语言,也可以通过其他一些如Jedis,或者Spring的RedisOperations 等,来执行Reids命令Redis command list

foreign 主要是提供给外部使用的一些监听器,比如你想利用cs派生一个meterpreter的shell回来,来继续后面的内网渗透,这时就选择使用外部监听器

分布式锁主要需要以下redis命令,这里列举一下。在实现部分可以继续参照命令的操作含义。

再来简单演示下,如何快速创建一个监听器,具体过程如下

  1. SETNX key value (SET if Not eXists):当且仅当 key 不存在,将 key 的值设为 value ,并返回1;若给定的 key 已经存在,则 SETNX 不做任何动作,并返回0。详见:SETNX commond
  2. GETSET key value:将给定 key 的值设为 value ,并返回 key 的旧值 (old value),当 key 存在但不是字符串类型时,返回一个错误,当key不存在时,返回nil。详见:GETSET commond
  3. GET key:返回 key 所关联的字符串值,如果 key 不存在那么返回 nil 。详见:GET Commond
  4. DEL key [KEY …]:删除给定的一个或多个 key ,不存在的 key 会被忽略,返回实际删除的key的个数(integer)。详见:DEL Commond
  5. HSET key field value:给一个key 设置一个{field=value}的组合值,如果key没有就直接赋值并返回1,如果field已有,那么就更新value的值,并返回0.详见:HSET Commond
  6. HEXISTS key field:当key 中存储着field的时候返回1,如果key或者field至少有一个不存在返回0。详见HEXISTS Commond
  7. HINCRBY key field increment:将存储在 key 中的哈希(Hash)对象中的指定字段 field 的值加上增量 increment。如果键 key 不存在,一个保存了哈希对象的新建将被创建。如果字段 field 不存在,在进行当前操作前,其将被创建,且对应的值被置为 0。返回值是增量之后的值。详见:HINCRBY Commond
  8. PEXPIRE key milliseconds:设置存活时间,单位是毫秒。expire操作单位是秒。详见:PEXPIRE Commond
  9. PUBLISH channel message:向channel post一个message内容的消息,返回接收消息的客户端数。详见PUBLISH Commond

点击左上角的Cobalt Strike菜单

Redis 实现分布式锁

-> 选中Listeners

假设我们现在要给itemId 1234 和下单操作 OP_ORDER 加锁,key是OP_ORDER_1234,结合上面的redis命令,似乎加锁的时候只要一个SETNX OP_ORDER_1234 currentTimestamp,如果返回1代表加锁成功,返回0 表示锁被占用着。然后再用DEL OP_ORDER_1234解锁,返回1表示解锁成功,0表示已经被解锁过。然而却还存在着很多问题:SETNX会存在锁竞争,如果在执行过程中客户端宕机,也会引起死锁问题,即锁资源无法释放。并且当一个资源解锁的时候,释放锁之后,其他之前等待的锁没有办法再次自动重试申请锁(除非重新申请锁)。解决死锁的问题其实可以可以向Mysql的死锁检测学习,设置一个失效时间,通过key的时间戳来判断是否需要强制解锁。但是强制解锁也存在问题,一个就是时间差问题,不同的机器的本地时间可能也存在时间差,在很小事务粒度的高并发场景下还是会存在问题,比如删除锁的时候,在判断时间戳已经超过时效,有可能删除了其他已经获取锁的客户端的锁。另外,如果设置了一个超时时间,但是确实执行时间超过了超时时间,那么锁会被自动释放,原来持锁的客户端再次解锁的时候会出现问题,而且最为严重的还是一致性没有得到保障。

-> 接着点击Add按钮会自动跳出监听器的配置框

所以设计的时候需要考虑以下几点:

-> 设置好端口ip [ 实际中最好用域名(走dns隧道) ]和payload类型即可创建,之后,团队服务器会一直监听该端口等待beacon shell回连的数据

  1. 锁的时效设置。避免单点故障造成死锁,影响其他客户端获取锁。但是也要保证一旦一个客户端持锁,在客户端可用时不会被其他客户端解锁。(网上很多解决方案都是其他客户端等待队列长度判断是否强制解锁,但其实在偶发情况下就不能保证一致性,也就失去了分布式锁的意义)。
  2. 持锁期间的check,尽量在关键节点检查锁的状态,所以要设计成可重入锁,但在客户端使用时要做好吞吐量的权衡。
  3. 减少获取锁的操作,尽量减少redis压力。所以需要让客户端的申请锁有一个等待时间,而不是所有申请锁的请求要循环申请锁。
  4. 加锁的事务或者操作尽量粒度小,减少其他客户端申请锁的等待时间,提高处理效率和并发性。
  5. 持锁的客户端解锁后,要能通知到其他等待锁的节点,否则其他节点只能一直等待一个预计的时间再触发申请锁。类似线程的notifyAll,要能同步锁状态给其他客户端,并且是分布式消息。
  6. 考虑任何执行句柄中可能出现的异常,状态的正确流转和处理。比如,不能因为一个节点解锁失败,或者锁查询失败(redis 超时或者其他运行时异常),影响整个等待的任务队列,或者任务池。

图片 10

锁设计

图片 11

由于时间戳的设计有很多问题,以及上述几个问题,所以再换一种思路。先回顾几个关于锁的概念和经典java API。通过一些java.util.concurrent的API来处理一些本地队列的同步以及等待信号量的处理。

图片 12

  • Semaphore :Semaphore可以控制某个资源可被同时访问的个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。其内部维护了一个int 类型的permits。有一个关于厕所的比喻很贴切,10个人在厕所外面排队,厕所有5个坑,只能最多进去五个人,那么就是初始化一个 permits=5的Semaphore。当一个人出来,会release一个坑位,其他等坑的人会被唤醒然后开始要有人进坑。Semaphore同ReentrantLock一样都是基于AbstractQueuedSynchronizer提供了公平锁和非公平锁两种实现。如果等待的人有秩序的排队等着,就说明选择了Semaphore的公平锁实现,如果外面的人没有秩序,谁抢到是谁的(活跃线程就会一直有机会,存在线程饥饿可能),那就是Semaphore的非公平锁实现。无论外面人怎么个等法Semaphore对于出坑的控制是一致的,每次只能是从一个坑里出来一个人。理解起来,其实就是厕所的5个坑位是一个共享资源,也就是permits的值=5,每次acquire一下就是外面来了个人排队,每次release一下就是里面出来个人。厕所聊多有点不雅观,再回归到分布式锁的话题。在刚才讲述的redis实现分布式锁的“第三点”,减少redis申请锁调用频率上就可以通过Semaphore来控制请求。虽然Semaphore只是虚拟机内部的锁粒度的实现(不能跨进程),但是也可以一定程度减轻最后请求redis节点的压力。当然,也有种方法是,随机sleep一段时间再去tryLock之类的,也可以达到减轻最后redis节点压力,但是毕竟使用信号量能更好得控制。而且我们可以再简单点,对于同一个锁对象的申请锁操作,可以设计一个初始化permits = 0的LockEntry,permits = 0也就顾名思义,谁都进不来,厕所维修中。当有一个持锁对象unlock的时候,通过分布式消息机制通知所有等待节点,这时候,再release,这时候permits=1,也就是本虚拟机中只能有一个线程能在acquire()的阻塞中脱颖而出(当然只是进了坑,但不一定能获取得到分布式锁)。
  • ConcurrentHashMap:这个应该不必多说,之谈谈在设计分布式锁中的用途。在上述的“第一点”,对于锁的时效性的设置里提到了,要在持锁线程正常运行(持锁节点没有宕机或内部异常)的时候,保证其一直占用锁。只要占着茅坑的人还在用着,只要他还没有暴毙或者无聊占着茅坑不XX,那就应该让外面的人都等着,不能强行开门托人。再收回来。。。这里ConcurrentHashMap的key无疑是锁对象的标识(我们需要设计的redis的key),value就是一个时间任务对象,比如可以netty的TimerTask或其他定时API,定时得触发给我的锁重新设置延时。这就是好比(好吧,再次用厕所比喻),蹲在里面的人的一种主动行为,隔1分钟敲两下厕所门,让外面的等的人知道,里面的人正在使用中,如果里面的人1分钟超过还没有敲门,可能是里面人挂掉了,那么再采取强制措施,直接开门拽人,释放坑位。

说完监听器,最后,我们再来说payload [攻击载荷]

并发API以及一些框架的使用主要是控制锁的进入和调度,加锁的流程以及锁的逻辑也是非常重要。因为redis支持hash结构,除了key作为锁的标识,还可以利用value的结构

说白点儿其实就是个木马下载器,当目标触发payload以后,会自动去下载shellcode[其实就是beacon shell的代码]到目标系统中运行,最后成功弹回目标系统的beacon shell,

加锁

至于在beacon shell执行的指令都是按照计划任务来的,也就是说被控端会按事先规定好的时间自动去控制端下载各种指令任务依次在目标系统中执行

下面参数的含义先说明下 :

首先,我们先来简单创建个payload,然后直接把它丢到目标系统中执行,看看实际的上线效果到底是个什么样子,注意,这里带红爪子的是已经拿到系统最高权限的,没爪子的基本都是系统权限暂时还比较低的

  • KEYS[1] :需要加锁的key,这里需要是字符串类型。
  • ARGV[1] :锁的超时时间,防止死锁
  • ARGV[2] :锁的唯一标识,也就是刚才介绍的 id(UUID.randomUUID()) + “:” + threadId

图片 13

图片 14

图片 15

以上的方法,当返回空是,说明获取到锁,如果返回一个long数值(pttl 命令的返回值),说明锁已被占用,通过返回剩余时间,外部可以做一些等待时间的判断和调整。

图片 16

解锁

图片 17

也还是先说明一下参数信息:

0x04 丰富的客户端攻击选项

- KEYS[1] :需要加锁的key,这里需要是字符串类型。

首先,尝试利用 ‘System Profiler’ 模块,搜集目标的各类机器信息,比如,目标用的什么版本的操作系统,什么浏览器,详细版本是多少,有没有装flash,flash具体版本又是多少[低版本可以挂马],看能不能看到目标内网ip段,大概目测估计下目标内网有多大,有了这些基础信息以后,后期我们就可以针对性的写信发信,还是那句话,实际中最好用域名,因为这里是实验所以才直接用的ip,发信时最好用html伪装个比较”到位”的链接,关于写信发信又是另一个比较’专业’的技术点,个人能力有限,这里暂不涉及,嘿嘿……下面就给大家简单的看下实际的效果

- KEYS[2] :redis消息的ChannelName,一个分布式锁对应唯一的一个channelName:“redisson_lock__channel__{”

图片 18

  • getName() + “}”

图片 19

- ARGV[1] :reids消息体,这里只需要一个字节的标记就可以,主要标记redis的key已经解锁,再结合redis的Subscribe,能唤醒其他订阅解锁消息的客户端线程申请锁。

图片 20

- ARGV[2] :锁的超时时间,防止死锁

利用’hta payload’配合’文件下载’模块向目标发送各种钓鱼链接,首先,创建一个hta的payload,这里的payload暂时只支持三种可执行格式,exe,powershell和vba(宏),实际中更推荐用powershell,成功率相对较高,好处就不多说了,免杀,灵活…

- ARGV[3] :锁的唯一标识,也就是刚才介绍的 id(UUID.randomUUID()) + “:” + threadId

图片 21

图片 22

这就是解锁过程,当然建议提供强制解锁的接口,直接删除key,以防一些紧急故障出现的时候,关键业务节点受到影响。这里还有一个关键点,就是publish命令,通过在锁的唯一通道发布解锁消息,可以减少其他分布式节点的等待或者空转,整体上能提高加锁效率。至于redis的消息订阅可以有多种方式,基于Jedis的订阅API或者Spring的MessageListener都可以实现订阅,这里就可以结合刚才说的Semaphore,在第一次申请锁失败后acquire,接收到分布式消息后release就可以控制申请锁流程的再次进入。下面结合Redisson源码,相信会有更清晰的认识。

图片 23

使用Redisson示例

图片 24

Redisson使用起来很方便,但是需要redis环境支持eval命令,否则一切都是悲剧,比如me.结果还是要用RedisCommands去写一套。例子就如下,获得一个RLock锁对象,然后tryLock 和unlock。trylock方法提供了锁重入的实现,并且客户端一旦持有锁,就会在能正常运行期间一直持有锁,直到主动unlock或者节点故障,主动失效(超过默认的过期时间)释放锁。

图片 25

图片 26

图片 27

Redisson还提供了设置最长等待时间以及设置释放锁时间的含参tryLock接口 boolean tryLock(long waitTime, long leaseTime, TimeUnit unit) throws InterruptedException; 。Redisson的lock 扩展了java.util.concurrent.locks.Lock的实现,也基本按照了Lock接口的实现方案。lock()方法会一直阻塞申请锁资源,直到有可用的锁释放。下面一部分会详细解析一部分关键实现的代码。

图片 28

Redisson源码解析

图片 29

Redisson 的异步任务(Future,Promise,FutureListener API),任务计时器(Timeout,TimerTask),以及通过AbstractChannel连接redis以及写入执行批处理命令等很多都是基于netty框架的。po主因为不能使用eval,所以用Spring提供的redisApi ,RedisOperations来处理redis指令,异步调度等用了Spring的AsyncResult,MessageListener以及一些concurrent api。这里还是先看一下Redisson的实现。

生成基于各类语言的shellcode,如,c,c#,java,python,powershell,ruby,raw,另外,cs也提供了可直接配合veil一起使用的选项,这里还是以最实用的powershell为例,生成好以后,想办法把脚本载入到目标系统中,这里就直接在目标cmd中载入了,实际中你可以把这个代码单独扣出来放到任何能执行ps的地方

trylock

# powershell –exec bypass –Command "& {Import-Module 'C:payload.ps1'}"

这里以带参数的trylock解析一下,无参的trylock是一种默认参数的实现。先源码走读一下。

图片 30

图片 31

图片 32

图片 33

图片 34

本文由betway必威官网注册发布于科学,转载请注明出处:老板都乐疯了,快速上手

关键词:

上一篇:没有了

下一篇:全套负载均衡方案,黑车司机更加猖狂了