用户
搜索
  • TA的每日心情

    昨天 22:02
  • 签到天数: 68 天

    连续签到: 1 天

    [LV.6]常住居民II

    i春秋作家

    Rank: 7Rank: 7Rank: 7

    4

    主题

    76

    帖子

    2365

    魔法币
    收听
    0
    粉丝
    10
    注册时间
    2015-11-20

    i春秋签约作者

    发表于 2018-4-20 04:02:01 4012878
    Hi , 我是凉风 半年不见了啊,我又回来了因为太菜都不好意思发文章了

    0x00 目录
    0x01 前言
    0x02 利用fd分析与实战
    0x03 Python+burp简易搭建代理服务器
    0x04 实现自动化exp
    0x05 结束语


    0x01 前言    本文只是对某校园热水服务app做个测试,其实本人并没有做大坏事,并未传播相关技术,文章以下内容的敏感部分会打码,并且相关厂商已经正在进行漏洞修复,大家看看就好。文章后会提供“Python简易搭建代理服务器”的关键代码,代码简单而且开源,我自己也加了点注释。最后的exp只针对本app,感兴趣的朋友可以看看。以下内容包含个人见解,轻喷。若有误导恳请指出。


    0x02 利用fd分析与实战
      要对这app做测试,首先了解下app的运作流程。
    登录后,app主界面如下
    1.软件截图.png

    逻辑简单,步骤如下:
    1.app使用蓝牙连接水表。
    2.先扣你10块余额,转到预扣款里(不够10元扣除所有)
    3.水表上显示10块钱,也就是你的预扣款(我只有6元所有会显示6元),水表出水
    4.用水,水表上的金额随着用水量而减少
    5.停止用水,水表上显示的金额就是余额,将返还给余额
    这样分析还不够,我们利用fiddler看看app向服务器的HTTP请求内容
    怎么抓手机包看这,讲的比我好我就不多说了:如何用Fiddler对Android应用进行抓包

    app启动时的HTTP数据请求截图:
    2.fiddler截图.jpg

    一共请求了5次,没发现什么地方有问题。要想知道这些请求都是做什么的,可以看看请求的get的内容以及post的内容,还可以看看网站的响应内容。从截图中fiddler右下角的“Message=未发现版本”就可以猜想这个http请求可能是检查更新的请求。
    我们用的是“fiddler”,大家都知道的,许多利用都是改金额,现在还没用水,还没发生金额的变化,咱们现在用水试试。



    点击“点击开始用水”按钮,看看app截图以及fiddler的http请求
    4.正在用水截图.png 3.fiddler用水截图.png
    app扣除了6块,转到了预扣款里,水表上显示6.00元,<img>假装有水表照片.jpg</img>
    看fiddler截图,一共有4个http请求,注意红框,“00A3AAAF”是本次用水的订单号,之后会用到。
    看了下这些http请求,发现并未和服务器发生有关金额的信息交互。
    我们进行下个步骤,停止用水让它退还余额。
    app截图,以及fiddler抓取到的金额数据截图:
    5.app待结账.png 7.fiddler改金额.png

    可以看到之前红框框起来的订单号在结账返还金额的时候用到了,不用改。bal的值明显就是退还金额,将他改为6,也就是我的预扣款试试。成功退还所有预扣款!(这app有两次http请求返回的余额,内容都相同,都需要改为6,另一次就不贴截图了)
    8.app金额退还.png
    点击确认结账就余额就能变回6元了,这个“确认结账”按钮实际上是个刷新命令。

    0x03 Python+burp简易搭建代理服务器
    之前已经用fd实现漏洞利用,但是每次都需要手动改,如果写个脚本会比较快一些。正巧我在某同性交友网看到了“Python搭建代理服务器”的代码,就想试试能不能通过这个代码稍加更改实现自动化Exp。


    贴出原代码:
    [Python] 纯文本查看 复制代码
    #coding:utf-8
    import socket
    import thread
    import urlparse
    import select
    
    BUFLEN = 8192
    
    
    
    class Proxy(object):
        def __init__(self, conn, addr):
            self.source = conn
            self.request = ""
            self.headers = {}
            self.destnation = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            self.run()
    
    #用来构造header
        def get_headers(self):
            header = ''
            while True:
                header += self.source.recv(BUFLEN)
                index = header.find('\n')
                if index > 0:
                    break
            # firstLine,self.request=header.split('\r\n',1)
            firstLine = header[:index]
            self.request = header[index + 1:]
            self.headers['method'], self.headers['path'], self.headers['protocol'] = firstLine.split()
    
    #用来发送请求
        def conn_destnation(self):
            url = urlparse.urlparse(self.headers['path'])
            hostname = url[1]
            port = "80"
            if hostname.find(':') > 0:
                addr, port = hostname.split(':')
            else:
                addr = hostname
            port = int(port)
            ip = socket.gethostbyname(addr)
            print ip, port
            self.destnation.connect(('127.0.0.1', 8080))  #可以填burpsuite的代理
            data = "%s %s %s\r\n" % (self.headers['method'], self.headers['path'], self.headers['protocol'])
            self.destnation.send(data + self.request)   #发送请求
            print data + self.request
    
    #发送响应的结果
        def renderto(self):
            readsocket = [self.destnation]
            while True:
                data = ''
                (rlist, wlist, elist) = select.select(readsocket, [], [], 3)
                if rlist:
                    data = rlist[0].recv(BUFLEN)
                    if len(data) > 0:
                        self.source.send(data)#发送响应的结果
                    else:
                        break
            # readsocket[0].close();
    
        def run(self):
            self.get_headers()
            self.conn_destnation()
            self.renderto()
    
    
    class Server(object):
    
        def __init__(self, host, port, handler=Proxy):
            self.host = host
            self.port = port
            self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            self.server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
            self.server.bind((host, port))
            self.server.listen(5)
            self.handler = handler
    
        def start(self):
            while True:
                try:
                    conn, addr = self.server.accept()
                    thread.start_new_thread(self.handler, (conn, addr))
                except:
                    pass
    
    
    if __name__ == '__main__':
        s = Server('127.0.0.1', 6666)   #这里写本地ip,监听的端口。
        s.start()


    关键部分我写了注释,还有代码不清楚格式是否会乱,我在文后以附件的形式贴出来吧

    这次配合burpsuite来使用,使用方法:第90行(倒数第二行)写入之前用fiddler改包时手机wifi设置的代理,以及端口号,用来监听手机发出的http请求。第44行写burpsuite监听的地址,从手机上获取的http请求都会转发给burpsuite,burpsuite设置我也贴出来吧:
    9.burp设置.png 10.burp设置2.png
    设置好后,只要运行代码,就可以实现代理服务。虽然想要代理直接连burp就好,但是这提供了一个可以使用PY代码进行一定程度的中间人操作的环境。


    0x04 实现自动化exp
    PS:看到这里就可以不看了,因无法提供app与蓝牙水表,以下内容多半无法看明白。。
      之前实现了代理,那么现在就要开始改代码了,将代码改成漏洞app的漏洞利用工具。
    因为这个不是通用型漏洞,漏洞利用工具也只能针对这个app,所以以下内容不存在干货,感兴趣的可以看下去。
    思路:通过这个代理,将停止用水后“结账”请求中返还的金额替换为预扣款的金额,即返还所有金额。
    还有个:对app的http请求分析的越透彻,exp就可能写的越简单思路越清晰。


    漏洞利用程序方法众多,以下将按我自己的思路


      从之前的fd测试可以知道,“用水”与“结账返还金额”是两个独立的http请求部分,根据常识“结账”肯定要在“用水”之后,那我们可以在app执行“用水”之后就马上向服务器请求伪造的“结账”http请求,因伪造的“结账”请求只是PC机跳过app与服务器交互,所以执行结账后不会影响蓝牙水表的供水。这种思路有个前提,就是能成功伪造“结账”请求,如果无法伪造,也可以在“结账”请求发出时拦截并改包,这样理论上是不会出问题的。

    伪造“结账”需要在“用水”之后,那怎么判断“用水”请求?
    用 if 判断数据的特征,简单明了。因为只是判断,不是拦截,所以只需要在conn_destnation函数的结尾,也就是destnation.send() 执行后,添加 if 判断即可,如果是“用水”便开始伪造“结账”。因为结账需要订单号,所以可以用re模块正则表达式匹配“用水”请求的特征时顺带取出订单号,见截图:
    11.代码.png
    订单号正好包含在URL中,真方便。
    用if判断不为空就可以刚刚获取的订单号进行伪造的“结账”了
    伪造“结账”请求需要类似cookies的凭证,凭证存在header里,可以直接使用“用水”请求的header。
    可是!!我发现用水、结账、查余额等一系列操作是使用的header中的凭证永不过期,若重登会给予新的凭证,但旧凭证依旧可以使用!所以就可以偷懒直接贴一份header使用。
    12.header.png

    有了凭证就可以为所欲为了,伪造“结账”请求除了订单号还需要知道预扣款,前面提到过,预扣款一般为10元,但有时候余额不足预扣款就不足10元,所以为了程序兼容性,还需要获取下预扣款。既然有了凭证为所欲为,那么可以再伪造下一个能让服务器返回预扣款的请求即可。
    13.查预扣款.png
    见上图:有了凭证,并且正好服务器返回的是json形式的,直接用Python 的 eval,再获取对应键值就行。
    然后就是执行伪造的“结账”请求:
    14.伪造结账请求.png


    0x05 结束语
      终于结束了,感谢看我这篇文章的人,更感谢从头到尾看完的人,不枉我写这篇文章,毕竟对于你们来说是没见过的app,这太抽象了,并且文章内容无聊,而且读代码远比写代码困难,遗憾的是不能提供实验环境。要是有人看完我会很开心,谢谢啦QAQ
    PS:感觉今晚丞相的支持
    15.一键日百度.png
    附件:
    游客,如果您要查看本帖隐藏内容请回复






    评分

    参与人数 3积分 +50 魔法币 +10 收起 理由
    KeCheng + 5 fiddler是个好东西啊
    仰望大佬的小白 + 5
    Mickey_gl + 50

    查看全部评分

    提示: 作者被禁止或删除 内容自动屏蔽
    使用道具 举报 回复
    w8ay 发表于 2018-4-21 15:43
    一句话,用水后拦截“结账”的发送包,伪造成自己的发送包发送.?
    既然是蓝牙用水,可以找蓝牙的数据包,伪 ...

    是啊 可是我不会 其实还有另一种方法零成本洗 我没贴出来,完全不跟服务器交互,直接欺骗app 思路挺多
    使用道具 举报 回复
    凉风有信 发表于 2018-4-21 21:13
    是啊 可是我不会  其实还有另一种方法零成本洗 我没贴出来,完全不跟服务器交互,直接欺骗app 思路挺 ...

    求不交互的方法,亲测以上方法已经失效
    使用道具 举报 回复
    crZh 发表于 2018-4-20 22:38
    大神,请教下最后的自动化攻击用到burp了吗?感觉没用到呀

    burp接收Py代码转发的http请求而已,burp并没做什么,简单来说就是Py负责改包,burp负责发包
    使用道具 举报 回复
    发表于 2018-4-21 15:43:31
    一句话,用水后拦截“结账”的发送包,伪造成自己的发送包发送.?
    既然是蓝牙用水,可以找蓝牙的数据包,伪造一下不就可以直接用吗?
    python部署的在线渗透平台http://systeminfo.applinzi.com/
    使用道具 举报 回复
    本帖最后由 凉风有信 于 2018-4-20 12:26 编辑
    iu11 发表于 2018-4-20 11:00
    诶,隐藏的是不是Filddelr,想下载~

    emmmm fiddler 百度第一个就好
    使用道具 举报 回复
    仰望大佬的小白 发表于 2018-4-23 18:04
    阿风棒棒的,喜欢这样的实战文章

    emmmm
    使用道具 举报 回复

    说出来怕不是要被查水表
    使用道具 举报 回复
    发表于 2018-4-20 10:34:47
    沙发坐稳了!
    使用道具 举报 回复
    发表于 2018-4-20 10:53:32
    厉害厉害666
    使用道具 举报 回复
    发表于 2018-4-20 11:00:51
    诶,隐藏的是不是Filddelr,想下载~
    使用道具 举报 回复
    坏蛋 管理员 欢迎大家来春秋群找我玩 秦 楚 燕 魏 齐 赵 春秋文阁
    12#
    发表于 2018-4-20 11:15:42
    阿风棒棒的,喜欢这样的实战文章
    欢迎加入i春秋QQ群大家庭,每人只能任选加入一个群哦!投稿请加我QQ:286894635。
    i春秋—楚:533191896
    i春秋—韩:556040588
    i春秋CTF交流学习群:234714762
    使用道具 举报 回复
    发表于 2018-4-20 14:39:40
    可以,感谢分享
    使用道具 举报 回复
    发表于 2018-4-20 15:19:26
    大佬厉害,感谢分享
    使用道具 举报 回复
    发表于 2018-4-20 21:28:17
    跟我们学校的好像是同款app
    寻一方沃土
    使用道具 举报 回复
    感谢楼主分享
    使用道具 举报 回复
    发表于 2018-4-20 22:38:30
    大神,请教下最后的自动化攻击用到burp了吗?感觉没用到呀
    使用道具 举报 回复
    哇,学习了学习了
    使用道具 举报 回复
    发表于 2018-4-21 10:04:00
    使用道具 举报 回复
    发表于 2018-4-21 15:22:03
    某同性交友网。。。厉害啦
    使用道具 举报 回复
    123下一页
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册