被黑客分分鐘玩死的微信聊天機器人
雷鋒網 (搜索“雷鋒網”公眾號關注) 按:本文作者傲客,i春秋授權雷鋒網獨家首發。
寫在前面
微信作為時下最in最熱的移動端即時通訊App,把我們的工作和生活緊密聯系到了一起。一個 腦洞 大開的程序猿寫了 用開源程序改了一個微信聊天機器人 ,并且在不斷調試中給它 賦予了n多好玩的功能譬如防撤回信息之類 。然后好死不死他在號稱白帽黑客歡喜地的?“i春秋-信息安全魔法學院”微信群中做機器人的調試,于是分分鐘被兇殘的壞蛋們玩壞,這個小程序猿也被微信封號處理,結果頑強不息的程序員為了突破微信封鎖又做了很多逗逼嘗試……因為事情過于搞笑,雷鋒網特意向i春秋學院約稿,把故事前因后果梳理出來。截圖比較多,但是高潮迭起,值得看完。
?以下是正文:
前段時間用開源程序做了一個微信聊天機器人,放到i春秋魔法學院群里做調試。然后被一群黑客玩壞了。但是整個過程還是比較好玩的,所以記錄下來這個事情的來龍去脈,不過提前聲明,這樣做是不對的,沒有考慮后果就貿然跑代碼測試也是不負責任的,尤其是你不知道黑客們會用什么方法幫你測試,真的有封號的風險哦,請大家不要學我!(真要測試也要用小號測試?)
-
起源——為啥要做這個死
最近因為某些原因,想給自己找點事情干填補空閑時間,前一段時間在 Github 上看到一個微信機器人的代碼,代碼鏈接: Urinx/WeixinBot ,大致功能就是 用python實現一個命令行版的微信,內置了兩個聊天機器人的API可以實現自動回復,但默認不開啟 ,于是打算試一下。程序跑起來大概就是這個樣子: ?
微信掃碼登錄后:
去小黃雞和小逗機器人API網站注冊兩個測試key,在代碼中找到自動回復的變量設置成true就可以實現消息自動回復,改好代碼運行,在群里稍加引導,就被人們玩起來了。
-
防撤回機器人原理
群里正玩著高興,我開始看代碼,消息監聽部分的代碼大致是這樣的:
分類那么細致,還有撤回消息,我果斷動起了 做防撤回機器人 的念頭,就是在有人撤回消息的時候用這個聊天機器人把撤回的消息原封不動地發回來,這個念頭出來后我就離作死越來越近了。
有了上面代碼的基礎,撤回機器人的實現就不是難事了。 最先解決最簡單的文字撤回 ,在第一個消息分類中加入代碼邏輯,將所有文字消息的文字和發信人緩存到一個字典中,形成這樣一個字典結構:
{'某S': '各位表哥,有機會一起睡覺', '某客': '好啊好啊', '大叔': 'py交易'}
當有人撤回時,程序執行到撤回分支中,用撤回的人去找剛才字典的key,取出字典中的value發送出去,拼接成如下代碼:
self.webwxsendmsg('\"'+celSrc+'\"撤回了消息,撤回的消息是:'+self.msgdic.get(celSrc), msg['FromUserName'])
其中celSrc是撤回人,比如大叔撤回了消息,那么“celSrc”就是大叔,從字典中找到key為“大叔”的對象,對應的value就是“py交易”這樣再把消息發回到消息源中就實現了這樣的效果:“大叔”撤回了消息,撤回的消息是:py交易。其實這種寫法是有bug的,我先不說,可以在下面回復我,最好帶解決方案哦。
-
調試過程
我并沒有特別好的python功底(我是做.NET、前端和node.js的,不過我膽大,啥代碼都敢碰),而且手頭沒有python斷點調試工具,只能通過print打印調試,并且犯二的用了自己的微信號調試,調試過程還算順利,很快就滿足了基本需求:
?
?
看著代碼穩定運行了,我就去干別的了,就在這時候被群友玩壞了:
類似的超長消息發了十幾條左右被我發現了,馬上關閉了程序,但已經晚了,我被微信關了小黑屋……
?
我意識到我沒有寫字數限制,導致群里發多長的消息再撤回我都原封不動的發出來,構成炸群行為。記得我被封殺前的最后幾條消息就是說我要寫字數限制,然而微信并沒有給我這個改正的機會。
?
-
鐵窗淚——微信小黑屋規則探索
微信被封是啥滋味的?首先,發消息肯定沒戲。
?
發個朋友圈通知下大家吧,門都沒有。
?
我基本與外界隔絕了聯系,放棄了任何希望,只望老實改過,好好做人,就在這時,傲客(注:i春秋魔法學院微信群群主)給我發了個紅包,我發現我竟然可以正常搶紅包。
?
紅包功能不受限制的話,我是不是可以利用一下?
?
?
哈哈哈,機(dou)智(bi)的傲客,我發紅包他也發紅包。發現這個新大陸之后我至少可以用紅包簡單地跟我的微信好友溝通了,可以讓常聯系的人加我小號,不會以為我消失。我找到了封號后的溝通方式。
-
感受與思考
曾經在知乎上看到這樣一篇文章, 一個俄羅斯程序員,生活在終端里,只要任何事情花費時間超過了90秒,他一定會寫一個腳本自動化實現。
比如工作日晚上九點之后這名程序員的運維服務器中還有正在運行的SSH進程,就會給妻子發一個今天加班的短信,并從文本庫中隨機選取一句加班理由。 早上8點45分服務器中依然沒有活動的SSH進程會自動向BOSS發一封“今天我身體不適的”的郵件,并隨機附上一段請假理由。
還有一個老子要喝咖啡的腳本,這個腳本在執行之后,會先精確等候17秒,然后打開一個SSH進程,遠程連接到公司的咖啡機,然后傳送一堆代碼過去,咖啡機就會煮一份中杯半咖啡因的拿鐵咖啡,然后精確等待24秒后,再倒進咖啡杯里。這個腳本運行的全程,正好是這名程序員從自己的辦公桌前起身,走到咖啡機前所需要花費的時間。(此項目開源在github中:hacker-scripts)
我的這次作死經歷也可以探索出更多的自動化解決方案,防撤回只是微信機器人的一個有趣的玩法 , 自動請假完全不在話下, 拋開微信,生活中那么多重復性操作也可以作為探索用代碼去實現。
試想一個iOS開發狗的某一天,清晨,音箱從你最近聽過的播放列表中挑選你最喜歡的歌曲叫你起床,并自動播報當天天氣和空氣質量,提醒你是否需要帶傘帶口罩,面包機早已烤好面包。出門后服務器自動向優步發出叫車請求。到公司后自動將未完成的工作發到你的郵箱,并自動從項目管理系統中收集新的bug,從AppStore中抓取低星評價并告知你。你的微信可以自動回復客服推上來的重復性問題,工作時間長了自動提醒你活動一下,女神來消息自動回復永不錯過,寫好的PPT、報告、流程圖放到某個文件夾中自動發送郵件給相關人,晚上加班晚了自動發微信告知老婆/父母……這一切都來自你的代碼,想想是不是蠻激動的?(雷鋒網注:神奇的代碼,跪服)
-
尾巴
高中時,晚上做完作業,窩在一間小屋子中,拿著父母換下來的單色屏舊手機,背著父母偷偷的給心動的女生發短信,或核對當天的作業,或含蓄的聊天表達心中的波瀾。每條一毛錢,70字以內,安全的送達到對方的手機上,安心、踏實。如今,微信成為了我們最重要的溝通方式。我們多久沒有發過短信,多久沒有登過QQ?我們的手機號碼都已不再重要了,有微信就夠了。微信提供的服務固然便捷,我們的社交圈子大了,微信加的好友越來越多,人與人之間似乎也越來越近,我們好像可以聯通整個世界。但當微信真的無法為我們服務的時候,會發現,有那么一部分人只能存在你的記憶中了……
編者語
此次“作死”事件的主角圖南是一枚浸淫多年的程序猿,由于興趣,在i春秋進行了網絡安全方面的學習,而這次破壞微信撤回機制的惡作劇也從一個側面反映了微信的安全漏洞,設想如果每個人都把這個防撤回機制編寫入自己的微信,那么我們平常聊天會因為錯發、誤發泄露多少隱私。嗯,這里給i春秋點個贊,培養“人”的安全基因,讓開發工程師具備安全意識,這樣,在軟件的開發過程中未雨綢繆,解決隱患于未然,才讓信息時代充滿安全感。