*本文原创作者:whoisyourdaddy,属Freebuf原创奖励计划,转载请注明来自FreeBuf
年底各厂陆续举办年会,年会期间自然少不了红包,只不过我厂年底搞了个APP专门进行抢红包,国际惯例,手快有,手慢无。于是萌生了利用脚本尝试抢红包的想法。
APP是利用弹幕的形式将红包,交流信息展现在公屏上,所有人看到红包都可以去点,手快的人将获得红包。利用burpsuite代理获取抢红包的请求。
POST /usr/urm/v1/getPacket.do HTTP/1.1
[...]
{"termId":[],"appVersion":"1.0.0","termTyp":"IOS","channelId":[],"osVersion":"10.2","deviceId":"abc","clientId":"eeeeeeeee","packetId":"201701122218100057","requestTm":"20170112221811","tokenId":[],"usrNo":[]}
抢红包需要对应的红包标识packetId,是由毫秒级的时间戳生成的红包标识。在红包未抢完之前,抢红包的时间requestTm的接近程度则决定是否可以抢到红包。只需要第一时间构造请求便能妥妥的抢到红包。构造请求的关键是packetId,问题是如何获取?查看所有的burpsuite请求未发现下发的packetId。
用wireshark试试,发现了packetId。
Python上的抓包模块,可以设置过滤器实时抓取网络数据包,配合dpkt模块可以完成对网络数据包的分析。建议在linux下安装,win上较复杂,这里使用kali linux运行如下命令即可,也可以从这里获取PyPcap。
apt-get install libpcap-dev
pip install pypcap
import pcap
import dpkt
import datetime
import socket
from dpkt.compat import compat_ord
pc=pcap.pcap('eth0') #参数可为网卡名,如eth0
pc.setfilter('src host 192.168.2.5 or dst host 192.168.2.5') #设置监听过滤器,这里指定ip
def mac_addr(address): #转换mac地址为字符串
return ':'.join('%02x' % compat_ord(b) for b in address)
def inet_to_str(inet): #转换ip地址为字符串
try:
return socket.inet_ntop(socket.AF_INET, inet)
except ValueError:
return socket.inet_ntop(socket.AF_INET6, inet)
for timestamp,buf in pc: #timestamp为收到时间,buf为收到数据
eth=dpkt.ethernet.Ethernet(buf)
if not isinstance(eth.data, dpkt.ip.IP):# 确认包含ip数据包
print 'Non IP Packet type not supported %s\n' %eth.data.__class__.__name__
continue
ip = eth.data
if isinstance(ip.data, dpkt.tcp.TCP):# tcp数据包
tcp = ip.data
try: #解析http请求
request = dpkt.http.Request(tcp.data)
except (dpkt.dpkt.NeedData, dpkt.dpkt.UnpackError):
continue
#获取数据包信息并打印
do_not_fragment = bool(ip.off & dpkt.ip.IP_DF)
more_fragments = bool(ip.off & dpkt.ip.IP_MF)
fragment_offset = ip.off & dpkt.ip.IP_OFFMASK
print 'Timestamp: ', str(datetime.datetime.utcfromtimestamp(timestamp))
print 'Ethernet Frame: ', mac_addr(eth.src), mac_addr(eth.dst), eth.type
print 'IP: %s -> %s (len=%dttl=%d DF=%d MF=%d offset=%d)' % \
(inet_to_str(ip.src),inet_to_str(ip.dst), ip.len, ip.ttl, do_not_fragment, more_fragments,fragment_offset)
print 'HTTP request: %s\n' % repr(request)
启动burpsuite,设置手机wifi代理指向burpsuite。
运行编写好的抓包脚本,等待APP启动抓包,所有源地址和目的地址为指定IP的数据包将被捕获,效果图如下:
一旦检测到源地址为服务器地址,且内容包含参数packetId,获取该参数值,使用当前时间作为requestTm,随后构造请求第一时间提交进行抢红包。以下是构造请求的方法。
def post_do(packetId):
currenttime= time.strftime('%Y%m%d%H%M%S',time.localtime(time.time()))
requrl = 'http://example.com/usr/urm/v1/getPacket.do'
header= {
'Host' : 'example.com',
'Content-Type' : 'application/json',
'Connection ' : 'close',
'User-Agent' : 'MapSocial/1.0.0 (iPhone; iOS 10.2; Scale/3.00)',
'Accept': '*/*',
'Accept-Encoding' : 'gzip, deflate',
'Accept-Language' : 'zh-Hans-CN;q=1, en-CN;q=0.9, zh-Hant-CN;q=0.8',
'Cookie' : 'SDJH_JSESSIONID=[]'
}
body_value = {"termId":[],"appVersion":"1.0.0","termTyp":"IOS","channelId":[],"osVersion":"10.2","deviceId":"abc","clientId":"eeeeeeeee","packetId":packetId,"requestTm":currenttime,"tokenId":[],"usrNo":[]}
body_value_json = json.JSONEncoder().encode(body_value)
request = urllib2.Request(requrl, body_value_json, header)
result = urllib2.urlopen(request).read()
return result
这是针对我厂抢红包APP的一个简单分析过程,思路可能比较简单。主要内容还是利用PyPcap进行实时网络数据监听。至于抢了多少红包,大家都懂的,毕竟月饼可不是那么好抢的。
*本文原创作者:whoisyourdaddy,属Freebuf原创奖励计划,转载请注明来自Freebuf
11月 上海
CIS 2019首席信息安全官闭门高峰论坛11月
CIS 2019议题抢先看10月
公开课双十一活动9月 上海
CIS 2019官网上线,早鸟票同步开售
已有 25 条评论
你的价值观有问题! 需要劝退
@ addison66 吓得我赶紧销毁了代码
你还想抢月饼么?
你的价值观有问题! 需要劝退
红包接口居然不加密……
都是土豪,不解释啊
几个问题:
这里不解的是,你厂用APP抢红包,难道还单独研发了一个有别于微信的APP软件? 在这个软件里发红包和抢红包?
如果是,则“代理”是一关,需要有人用你的代理才行,手机还好说,一般能开热点给大家分享,多少会有人上钩的,如果是wifi,那该如何应用代理?
如果否,进入下面的几个问题:
1、你用了代理软件,这说明你要抢别人的红包,要么是发红包的人用了你的代理来节省流量,要么是抢红包的人用了你的代理来节省流量才行,这样你才有截获的机会。
2、如果你用了这样的机会,那么我觉得你不需要做脚本了,你直接把与你一样抢红包的人的网络请求给取消多好呀,这样妥妥能抢到红包,而且如果你是发红包的,那么你不仅自己可以抢到自己的红包,还能把别人抢的机会给蒙过去,24小时后钱又回到你的手里了,哈哈,我是不是说中了?!呵呵
3、如果不是这样,也主不是代理软件用不上的场合,那怎么办嘞? 所以我觉得还是那种开发好的抢红包软件还得彻底,无人值守嘛,有红包自动就抢了,即使程序“慢了”,那也失误不了几个嘛。
@ linux0ne 这里我解释一下。首先这个APP确实我厂专门搞的用来年会之用,在这个APP里可以发红包、抢红包、收发消息,红包和消息均以弹幕的形式显示在APP界面,当看到弹幕出现红包的时候 所有人 都可以点击红包进行抢红包,相当于微信群里发了一个红包,所有群里的人都可以抢红包。
例如我发了一个红包,红包会发送到服务器,服务器再以广播的形式下发给频道内的所有人,也就是我文中提到的packetId。而不是其他人发出红包的时候捕获packetId,这里很关键。仅需要在我的APP与服务器间设置代理就可以捕获packetId,这就不需要如你所说的给所有人进行wifi代理。
我设置的代理只为我一个人抢红包,有两个目的:1是捕获由服务器下发的packetId 2是构造请求提交抢红包
我所需要做的就是打开手机端的APP。
@ linux0ne 我感觉你TMD就是个大S B
@ 爸爸 你特么是不是菊紧欠次奥啊!TMD纯RB一个!你那个鼻子下面儿那个是腚门儿吧~ 还特么有一帮孙子跟风,真是世风日下,你们是搞贱术还是搞技术哇! 说你们是人,就特么是给你们脸了!
昵称太狠了
@ linux0ne 兄台你发的言我真的有点震惊
@ linux0ne 厉害了我的哥,建议你回去补一下网络知识 还有客户端是怎么和服务器通信的 。。。 我实在佩服楼主能心平气和地给你把原理讲粗来
@ linux0ne 活捉一智障。
查看所有的burpsuite请求未发现下发的packetId。 我看截图是http的包,理论应该是可以抓到的。真想分析一下为啥抓不到!
@ taylorwin 嗯,大兄弟很敏锐。虽说是http的包,但我和我的同事在分析过程中均没能在burpsuite中捕获下发的packetId,没能搞明白为什么。后来APP很快就停止了红包功能,也无从进一步分析。不知是否还有其他人遇到过类似的情形,可能的原因是什么
@ whoisyourdaddy burp 里默认设置是 不抓json 的。估计是这个原因
@ whoisyourdaddy 设置代理的时候,有一句提示“浏览器可能会使用http代理,但其他应用可能不会”不知是不是这个原因?
@ taylorwin 我在我的kali运行脚本 抓到数据包了 也在找内个id ,我觉得我很接近了。还有 burp里是不会出现json的它只抓http的 要看只能看脚本打印在终端咯
@ 老夫开车怕过谁
抓到包拿到能够构造请求的关键参数值就差不多啦。
返回的应该是json,你没有设置burpsuite吧
抓包大家都会,精华的地方是监听网卡过滤出红包参数,然后自动发送给服务器,相当于某信的自动抢红包gua
@ 草莓丶丶 大兄弟说的是。不过某信的抢红包挂还真没研究过,感觉应该会很复杂吧。
看样子是http请求获取的packetId,还搞什么代理,自己伪造一个http请求获取不就行了。。。。
@ 五条杠 我不是很赞成你的想法,首先我并未发现客户端不断的请求去获取packetId。另外,红包是随机发出的,若是通过这种客户端请求的方式如何保证第一时间获取到红包packetId。就算是通过http请求获得,不断的向服务器发送重复的http请求也非明智之举,很可能触发一些风控规则。