隨著信息技術(shù)和智能制造技術(shù)的發(fā)展,越來越多的工控廠商如西門子、ABB、研華等在內(nèi)的各類工業(yè)控制設(shè)備或系統(tǒng)暴露在互聯(lián)網(wǎng)的網(wǎng)絡(luò)空間中,易被黑客利用其設(shè)備漏洞進行攻擊,引發(fā)嚴(yán)重后果。
為了對接入互聯(lián)網(wǎng)內(nèi)的工控設(shè)備或系統(tǒng)進行快速搜索監(jiān)測,掌握其設(shè)備的種類、規(guī)模及地理分布,迫切需要采用相關(guān)技術(shù)對聯(lián)網(wǎng)工控系統(tǒng)或設(shè)備進行識別。
由于聯(lián)網(wǎng)工控設(shè)備和系統(tǒng)在網(wǎng)絡(luò)上具有其相應(yīng)的特定屬性:主要包括使用的IP地址,相應(yīng)的端口和基于TCP/IP協(xié)議的特定工業(yè)通信控制協(xié)議,所以目前識別聯(lián)網(wǎng)工業(yè)控制系統(tǒng)或設(shè)備的通用方法是:
- 首先明確聯(lián)網(wǎng)設(shè)備所在IP地址段;
- 針對該IP地址段中的每一個IP及相關(guān)端口,依次根據(jù)各類聯(lián)網(wǎng)工控系統(tǒng)和設(shè)備工控協(xié)議所對應(yīng)的端口發(fā)起相應(yīng)數(shù)據(jù)包,建立控制協(xié)議連接;
- 如主機不可到達(dá)或端口不開放則主機和端口不存活,需等待TIMEOUT(超時)時間,如主機可到達(dá)或端口開放,主機和端口存活,聯(lián)網(wǎng)工控系統(tǒng)或設(shè)備返回數(shù)據(jù)包;
- 接收到返回數(shù)據(jù)包,解析其內(nèi)容,根據(jù)內(nèi)容中的關(guān)鍵報文與工控設(shè)備指紋庫里的指紋進行匹配并進行工控系統(tǒng)或設(shè)備進行識別;
- 如沒有接收到返回數(shù)據(jù)包,則依次使用下一工控協(xié)議,對IP和端口建立控制協(xié)議連接。
現(xiàn)有技術(shù)中采用IP和端口直接進行TCP的三次握手連接,成功則發(fā)送工控設(shè)備指紋探測數(shù)據(jù)包,失敗則進入下一個IP+端口的設(shè)備探測,導(dǎo)致主機不可到達(dá)或端口未開放帶來的TIMEOUT(超時)時間過長問題,同時沒有構(gòu)建完善的工控設(shè)備指紋庫,導(dǎo)致不能快速準(zhǔn)確識別工控設(shè)備的類型和型號等。
目前亟待解決的技術(shù)難題是:針對上述存在的問題,提供一種快速識別聯(lián)網(wǎng)工控設(shè)備的方法。因此,本文以西門之PLC為例進行探討Siemens PLC指紋識別方法。
方法一:Nmap指紋識別
- 開啟西門子S7 PLC協(xié)議仿真軟件

- 發(fā)現(xiàn)網(wǎng)段中開放102端口的ip
nmap -p102 -n 192.168.163.1/24 --open

- 如果是西門子PLC,可以進一步使用Nmap的s7-info.nse腳本進行指紋探測

方法二:PLC連接測試工具
- 還可以使用PLC采集軟件進行連接,獲取PLC詳細(xì)指紋

方法三:基于Wireshark流量分析獲取PLC指紋信息
- 使用Wireshark獲取PLC指紋信息
方法:打開wireshark,篩選cotp,點擊S7 PLC連接工具“連接”,此時Wireshark抓到一些數(shù)據(jù)包。

編號217號數(shù)據(jù)包:請求通訊;
編號220號數(shù)據(jù)包:配置通訊;
編號224號數(shù)據(jù)包:發(fā)送數(shù)據(jù)進行通訊;
編號226號數(shù)據(jù)包中可以看到PLC的CPU型號、序列號等指紋信息。

方法四:自定義Python腳本探測PLC指紋
- Python腳本提取指紋



講以上請求報文復(fù)制為hex stream.
import socket
from binascii import unhexlify,hexlify
def getSZL001c(Respons):
for i in range(int(len(Respons)/68)):
data = Respons[i*68+4:i*68+68].replace("00","")
try:
if unhexlify(data).decode("utf-8", "ignore") != "":
print (unhexlify(data).decode("utf-8", "ignore"))
except:
pass
def getSZL0011(Respons):
for i in range(int(len(Respons)/56)):
data = Respons[i*56+4:i*56+56].replace("00","")
try:
if unhexlify(data).decode("utf-8", "ignore") != "":
print (unhexlify(data).decode("utf-8", "ignore"))
except:
pass
def main():
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.connect(("192.168.163.137",102))
sock.send(unhexlify("0300001611e00000000100c0010ac1020100c2020102"))
sock.recv(1024)
sock.send(unhexlify("0300001902f08032010000080000080000f0000001000101e0"))
sock.recv(1024)
sock.send(unhexlify("0300002102f080320700000a00000800080001120411440100ff090004001c0000"))
Respons = (hexlify(sock.recv(1024)).decode())[82:]
getSZL001c(Respons)
sock.send(unhexlify("0300002102f080320700000a00000800080001120411440100ff09000400110000"))
Respons = (hexlify(sock.recv(1024)).decode())[82:]
getSZL0011(Respons)
sock.close()
if __name__ == '__main__':
main()

方法五:plcscan腳本探測
- plcscan腳本探測

下載鏈接:https://github.com/yanlinlin82/plcscan
總結(jié)
由于我的技術(shù)水平有限,所寫文章難免有不足之處,懇請各位大佬批評和指正,今后還會繼續(xù)分享有關(guān)工控安全技術(shù)文章。 在此,特別感謝烽臺科技燈塔實驗室舉辦的工業(yè)互聯(lián)網(wǎng)安全知識分享講座,跟著幾位大佬學(xué)到了很多知識,PPT和現(xiàn)場實驗演示都準(zhǔn)備的很精心,讓我收獲頗豐,以后還會繼續(xù)跟隨大佬們的腳步努力學(xué)習(xí),感謝!
參考鏈接
http://www.xjishu.com/zhuanli/62/201611189629.html
http://plcscan.org/blog/2017/03/fingerprint-identification-technology-of-industrial-control-system/
本文中使用到的仿真+采集工具,請在公眾號回復(fù)"工控指紋"獲得。
關(guān)注我們
Tide安全團隊正式成立于2019年1月,是新潮信息旗下以互聯(lián)網(wǎng)攻防技術(shù)研究為目標(biāo)的安全團隊,目前聚集了十多位專業(yè)的安全攻防技術(shù)研究人員,專注于網(wǎng)絡(luò)攻防、Web安全、移動終端、安全開發(fā)、IoT/物聯(lián)網(wǎng)/工控安全等方向。
想了解更多Tide安全團隊,請關(guān)注團隊官網(wǎng): http://www.TideSec.net 或長按二維碼關(guān)注公眾號:
