記一次mcpe服務器被黑與防御

0x00 起因

前幾天朋友跟我說他的服務器最近老是爆炸划纽,而且經(jīng)常是一到點就集體崩潰被芳,別的服主也有類似的情況萌抵,他給服務器套上全局代理之后服務器就不崩潰了兼砖,然而給服務器開了代理客戶端也連不進來篡九。一開始我猜測是BDS(Bedrock Dedicated Server抗碰,mcpe官方服務端)會與mojang服務器有連接价脾,連不上就會觸發(fā)某個bug導致崩潰随珠。

讓人絕望的內(nèi)存占用曲線

(圖片是windows服務器的內(nèi)存占用羽莺,服主windows和linux都有開)

報錯如下实昨,基本上只能得知是內(nèi)存分配相關的問題,從報錯判斷不出什么禽翼。

terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc
[2020-03-15 15:09:41 INFO] Package: com.mojang.minecraft.dedicatedserver
Version: 1.14.32.1
OS: Linux
Server start: 2020-03-15 14:53:05 UTC
Dmp timestamp: 2020-03-15 15:09:41 UTC
Upload Date: 2020-03-15 15:09:41 UTC
Session ID: e24ac8b6-8e41-4d53-ba6c-949b7bbcde90
Commit hash:
Build id: development
CrashReporter Key: e29bac8d-dc1e-3938-8438-413e8e159bce

Crash
[2020-03-15 15:09:41 INFO]  at gsignal (UnknownFile:?)
    at abort (UnknownFile:?)
    at __gnu_cxx::new_allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::allocate[unsigned long, void const*] (UnknownFile:?)
    at std::allocator_traits<std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::allocate[std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >&, unsigned long] (UnknownFile:?)
    at std::_Vector_base<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::_M_allocate[unsigned long] (UnknownFile:?)
    at std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >* std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::_M_allocate_and_copy<std::move_iterator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*> >[unsigned long, std::move_iterator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*>, std::move_iterator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*>] (UnknownFile:?)
    at std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::reserve[unsigned long] (UnknownFile:?)
    at PurchaseReceiptPacket::read[ReadOnlyBinaryStream&] (UnknownFile:?)
    at Packet::readNoHeader[ReadOnlyBinaryStream&, unsigned char const&] (UnknownFile:?)
    at NetworkHandler::_sortAndPacketizeEvents[NetworkHandler::Connection&, std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long, std::ratio<1l, 1000000000l> > >] (UnknownFile:?)
    at NetworkHandler::runEvents[bool] (UnknownFile:?)
    at Minecraft::update[] (UnknownFile:?)
    at ServerInstance::_update[] (UnknownFile:?)
    at clone (UnknownFile:?)

0x01 抓包分析

為了驗證這個想法屠橄,我連朋友的服務器抓了幾次服務器崩潰時的包,抓包用的是tcpdump闰挡,服務器開在docker容器里面锐墙,大概方法如下:

# 獲取容器PID
docker inspect --format "{{.State.Pid}}" <container id/name>
# 切換到容器的網(wǎng)絡命名空間
nsenter -n -t <container root id>
tcpdump -i eth0 -w dump.cap

但是服務器在線人數(shù)比較多,從抓到的包里面也沒分析出什么關鍵信息长酗。

0x02 問題排查

服務器還在一直崩潰溪北,不過時間段好像變化了,沒那么固定了夺脾,有時候也只是卡死一段時間之拨,服務器并沒有完全崩潰,此時除了懷疑MCPE服務器可能與mojang之間有連接之外咧叭,我慢慢地開始懷疑服主的群里面是不是有內(nèi)鬼蚀乔,但是群里面那么多人,也不好找誰是內(nèi)鬼菲茬,于是我們準備使用ip白名單的方式來排查問題吉挣,也就是把部分信任的人的ip加入防火墻白名單,如果此時還會崩潰的話婉弹,那基本就可以排除服務器是被人攻擊了的猜想睬魂,開了白名單之后服務器維持了很長一段時間穩(wěn)定運行,但是后來還是炸了镀赌。我當時有點像放棄了(服主跑路算了氯哮,哈哈哈哈哈)。

有內(nèi)鬼終止交易

0x03 內(nèi)鬼自爆

高潮來了商佛,開了白名單的那天晚上喉钢,內(nèi)鬼自爆了姆打,這個人直接在群里面坦白說是他炸的服,并且揚言還要繼續(xù)出牧,不過當時他由于未知的原因沒有黑成功穴肘,被群友的嘲諷了一晚上(具體原因可能是那天我們把服務器換到了內(nèi)網(wǎng),用frp內(nèi)網(wǎng)穿透的方式開了服務器舔痕,目的是為了排除mcpe服務器的xbox驗證可能導致崩潰评抚,由于網(wǎng)絡環(huán)境改變導致他的攻擊方式失效了)。

image

不過第二天服務器還是崩了伯复,大概就可以確認是這個人搞崩的慨代,服主提前找出了這個人在群里面的所有小號以及他的ip,并把他踢了出去啸如,那天開了白名單后服務器還是崩潰了的原因是服主看白名單很穩(wěn)定侍匙,就放松了審核,不小心讓內(nèi)鬼就混了進去叮雳。在這之后服主開始了嚴格的ip白名單審核想暗,服務器終于穩(wěn)定了下來。

0x04 重現(xiàn)bug

如果這么簡單結(jié)束了的話我是不會寫這篇文章的帘不,在我得到了內(nèi)鬼的相關信息之后说莫,我想知道他是怎么攻擊的。于是我又翻出了那天一開始抓的包寞焙,用服主得到的ip在包里面匹配储狭,可是并沒有找到什么,應該是換了ip了捣郊,然后我從ip歸屬地開始查辽狈,發(fā)現(xiàn)了一個跟內(nèi)鬼同一個歸屬地的ip。


image

理所當然地呛牲,我開始分析這個包的行為刮萌,發(fā)現(xiàn)他在服務器崩潰時刻發(fā)出了很多連接服務器的請求娘扩,每次的client GUID不一樣尊勿,我猜測服務端每發(fā)現(xiàn)一個客戶端連接時,不管它有沒有連進來都會給這個客戶端提前分配一段內(nèi)存畜侦,一次發(fā)送很多client GUID不一樣的包會讓服務端誤以為有很多客戶端在連接躯保,于是內(nèi)存不夠分配服務器就崩潰了旋膳。

hack0

為了驗證這個想法,我把這段包提取出來途事,用tcpreplay重放验懊,修改好網(wǎng)絡包的mac地址擅羞,ip和端口,向一個測試服務器快速重放這些可能會導致崩服的包义图,然而减俏,持續(xù)發(fā)了好幾分鐘,服務器紋絲不動碱工,內(nèi)存占用率是一條讓人尷尬的直線娃承。

于是我開始找別的線索,抓的包里面與服務器有連接的也就十幾個ip怕篷,我挨個查了一下歸屬地历筝,查完后我驚呆了,十幾個ip里面有6個ip是來自阿里云的廊谓,排除其中兩個是服主自己的服務器梳猪,還有4個,難道真正的攻擊者是內(nèi)鬼租的云服務器蒸痹?我挨個看了一下那幾個阿里云服務器的行為春弥,倒也看不出什么太大貓膩,我順手把那些包截取出來叠荠,稍作修改后開始對測試服發(fā)送匿沛,此時,測試服瞬間崩了蝙叛,內(nèi)存占用俺祠,報錯信息和前幾天的一模一樣,然后我重新看了下這些包借帘,

hack4

我猜是這樣發(fā)包才能騙過服務器有很多客戶端在與服務器建立連接蜘渣,具體的原理已經(jīng)不太重要了,畢竟這個得去研究一下BDS的協(xié)議才能知道詳細信息肺然,bug已經(jīng)復現(xiàn)了蔫缸,向mojang提交bug才是正確方式。

0x05 后續(xù)

內(nèi)鬼被踢了之后服主的主頁被d了际起。拾碌。〗滞現(xiàn)在還是黑洞狀態(tài)

0x06

感謝sow village(老母豬村服務器)提供素材.
首發(fā)于我的個人博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末校翔,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子灾前,更是在濱河造成了極大的恐慌防症,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蔫敲,居然都是意外死亡饲嗽,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門奈嘿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來貌虾,“玉大人,你說我怎么就攤上這事裙犹【『荩” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵伯诬,是天一觀的道長晚唇。 經(jīng)常有香客問我,道長盗似,這世上最難降的妖魔是什么哩陕? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮赫舒,結(jié)果婚禮上悍及,老公的妹妹穿的比我還像新娘。我一直安慰自己接癌,他們只是感情好心赶,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著缺猛,像睡著了一般缨叫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上荔燎,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天耻姥,我揣著相機與錄音,去河邊找鬼有咨。 笑死琐簇,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的座享。 我是一名探鬼主播婉商,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼渣叛!你這毒婦竟也來了丈秩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤淳衙,失蹤者是張志新(化名)和其女友劉穎癣籽,沒想到半個月后挽唉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡筷狼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了匠童。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片埂材。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖汤求,靈堂內(nèi)的尸體忽然破棺而出俏险,到底是詐尸還是另有隱情,我是刑警寧澤扬绪,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布竖独,位于F島的核電站,受9級特大地震影響挤牛,放射性物質(zhì)發(fā)生泄漏莹痢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一墓赴、第九天 我趴在偏房一處隱蔽的房頂上張望竞膳。 院中可真熱鬧,春花似錦诫硕、人聲如沸坦辟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锉走。三九已至,卻和暖如春藕届,著一層夾襖步出監(jiān)牢的瞬間挪蹭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工翰舌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留嚣潜,地道東北人。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓椅贱,卻偏偏與公主長得像懂算,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子庇麦,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容

  • (一)DDos分布式拒絕服務 DDos是Distributed Denial of Service攻擊的簡稱计技,即分...
    肆意咯咯咯閱讀 1,243評論 0 0
  • 常有人說,30歲是女人的分水嶺睡雇,30歲之前萌衬,你是穿著高跟鞋,頂著精致妝容它抱,穿梭在樓宇中的女強人秕豫;30歲之后,找個好...
    凌千一閱讀 9,736評論 20 158
  • 會員關懷不夠观蓄,需求了解混移,鏈接和訪談。 每個官員帶1-2個人每月做一次演講或者分享侮穿。 關懷成長進度L級通關歌径,儀式! ...
    積水成海河啊閱讀 126評論 0 0
  • 這本書的總體翻譯其實還可以亲茅,如果能夠讓讀者更加通俗易懂就更加好了回铛,尤其是最后一章使你更加智慧的建議。 這本書核心論...
    myfire閱讀 4,230評論 0 2
  • 何謂君子?君子乃文質(zhì)彬彬娶耍,德才兼?zhèn)湔呙庾耍痪訛槿柿x道德,容載萬物者榕酒;君子亦可為自強不息胚膊,胸懷天下者…… 品《老子...
    日月惟明閱讀 585評論 0 4