工控蜜罐Conpot部署和入门及高级演变
0×01 引言
蜜罐通常偽裝成看似有利用價值的信息系統,吸引黑客攻擊。由于蜜罐事實上并未對網絡提供任何有價值的服務,所以任何對蜜罐的嘗試都是可疑的。蜜罐中還可能裝有監控軟件,用以監視黑客入侵后的舉動。蜜罐在拖延黑客攻擊真正目標上也有一定作用。
——WikiPedia
傳統的Web蜜罐、服務蜜罐和數據庫蜜罐能夠通過模擬相關服務,欺騙黑客和漏洞掃描器的攻擊,幫助我們獲取網絡空間中的潛在威脅和了解新型的攻擊手段,是實現信息系統主動防御和攻擊欺騙的重要部分。
針對工業控制系統的網絡安全攻擊日益增多,多起重要工控系統安全事件應引起重視。
——《2016年我國互聯網網絡安全態勢綜述》CNCERT
隨著物聯網的發展,研究人員發現了大量的工控設備漏洞,根據賽門鐵克的報告,尤其是2015年,工控系統的漏洞被大量發現。一些黑客使用Shodan、Zoomeye、Fofa等搜索引擎,可以快速探查特定組織暴露在網絡空間中的設備資產,我們使用工控蜜罐能夠欺騙這些網絡資產搜索引擎,作為以攻擊者視角構建的陷阱,延遲和迷惑黑客的攻擊,在提高主動防御能力、獲取基礎威脅情報和輔助決策支撐等方面提供幫助。
Conpot是一個由glaslos等人開發的,用于獲得關于工控系統的威脅情報的開源ICS/SCADA蜜罐,本文將從Conpot展開,介紹其部署和使用的入門。
0×02 Conpot介紹
Conpot is a low interactive server side Industrial Control Systems honeypot designed to be easy to deploy, modify and extend. By providing a range of common industrial control protocols we created the basics to build your own system, capable to emulate complex infrastructures to convince an adversary that he just found a huge industrial complex. To improve the deceptive capabilities, we also provided the possibility to server a custom human machine interface to increase the honeypots attack surface. The response times of the services can be artificially delayed to mimic the behaviour of a system under constant load. Because we are providing complete stacks of the protocols, Conpot can be accessed with productive HMI’s or extended with real hardware. Conpot is developed under the umbrella of the?Honeynet Project?and on the shoulders of a couple of very big giants.
我大致地翻譯了官方的介紹:
Conpot是一個部署在服務端的低交互ICS蜜罐,能夠快速地部署、修改和拓展。開發者通過提供一系列的通用工控協議,使得我們能夠非常快速地在我們的系統上構建一套復雜的工控基礎設施用于欺騙未知的攻擊者。為了提高這套蜜罐的欺騙性和迷惑性,開發者同時也提供了一個人機接口來增加這套蜜罐的攻擊面。蜜罐的響應時間能夠通過相關參數進行調節,由此模擬出當前負載下的響應時間。Conpot對協議棧有著完整的支持,因此它能夠接收生產環境中的HMI或是直接拓展的真實硬件。最后要說明的是,Conpot是站在巨人的肩膀上,以Honeynet Project為基礎開發的。
Conpot官方已經為Conpot打包了Docker鏡像,可以作為容器快速部署。個人認為,使用docker來部署蜜罐/蜜網是現在的一個方向,不僅僅是這個工控蜜罐,包括其他的一些蜜罐,使用Docker能夠為蜜罐提供基礎的隔離環境,在較低資源占用下的大規模蜜罐/蜜網部署。安全人員可以把日志文件掛載到Host主機(在Conpot中,開發者使用HPFeeds來傳輸數據),通過這樣來隱蔽蜜罐的行為監控,主流的Docker集群框架(如K8S等)已經為我們提供了很好的解決方案。
0×03 搭建相關環境和安裝Conpot
在Docker上安裝
對于入門者,如果不想安裝Docker,可以直接在Daocloud注冊賬號,免費申請一臺膠囊主機,他們提供的主機已經安裝了Docker,所以直接pull鏡像就能開擼。需要注意的是,免費提供的膠囊主機只有120分鐘的生命周期!
以下是官方提供的幾個部署方式,我測試了第一種部署方法,推薦用第一種Pre-Build鏡像上手。如果需要自己定制docker鏡像,可以參考基于Ubuntu安裝的方法和官方的dockerfile,自行定制Dockerfile,用國內的源來下載和編譯,官方的源比較容易翻車。
使用Pre-Build鏡像運行
安裝Docker
運行docker pull honeynet/conpot
運行docker run -it -p 80:80 -p 102:102 -p 502:502 -p 161:161/udp --network=bridge honeynet/conpot:latest /bin/shPS. 可以根據自己的實際需要更改docker run中的參數,-p表示蜜罐暴露的端口號。
在容器中運行conpot --template default
瀏覽器中打開HTTP://YOUR_IP_ADDR,開擼!
從源代碼編譯鏡像,并使用Docker運行(這個方法使用了國外源,所以大概率會由于眾所周知的網絡原因翻車。)
安裝Docker
從Github中clone相關repo?git clone?https://github.com/mushorg/conpot.git
進入程序目錄?cd conpot
運行?docker build -t conpot .
運行docker run -it -p 80:80 -p 102:102 -p 502:502 -p 161:161/udp --network=bridge conpot
在Ubuntu安裝Conpot
1. 安裝依賴sudo apt-get install libsmi2ldbl snmp-mibs-downloader python-dev libevent-dev libxslt1-dev libxml2-dev
2. 從PyPi安裝Conpotpip install conpot
0×04 配置入門
在不指定參數的情況下,直接運行Conpot時,程序將使用以下的基礎配置。
[modbus] host = 0.0.0.0 port = 502[snmp] host = 0.0.0.0 port = 161[http] host = 0.0.0.0 port = 80[sqlite] enabled = False[hpfriends] enabled = False host = hpfriends.honeycloud.net port = 20000 ident = 3Ykf9Znv secret = 4nFRhpm44QkG9cvD channels = ["conpot.events", ][fetch_public_ip] enabled = True url = http://api-sth01.exip.org/?call=ip盡管Conpot官方提供了一個能夠模擬安裝若干拓展的Siemens S7-200 CPU蜜罐配置文件,能夠欺騙攻擊者或是漏洞掃描應用基于MODBUS、HTTP、SNMP 和 s7comm 等協議展開攻擊。可是現在的搜索引擎(比如shadon)已經能夠識別出一些簡單蜜罐的,也就是說,這種陷阱已經無法誘騙攻擊者了。所以說在更多情況下,我們需要定制自己的需求。
Conpot一共支持bacnet、enip、guardian_ast、http、ipmi、kamstrup、misc、modbus、s7comm和snmp等10個協議。
我們可以先嘗試著配置一個單一協議的IPMI(智能平臺管理接口)蜜罐,開始上手。
運行mkdir ipmi,cd ipmi
創建template.xml文件,配置模板的基礎信息。vim template.xml
3.?mkdir ipmi,cd ipmi,vim ipmi.xml。新建ipmi文件夾,配置ipmi協議的詳細信息。
<ipmi enabled="True" host="0.0.0.0" port="623"><device_info><device_name>SystemName</device_name></device_info><user_list><user><user_name>Administrator</user_name><password>Password</password><privilege>4</privilege><active>true</active><fixed>true</fixed></user></user_list></ipmi>通過上面這個例子,我們就能只要照著配置出IPMI的蜜罐,其中設備名稱使用的是我們在template.xml的databus中配置的SystemName,然后設置了IPMI協議中的用戶的相關信息。最終文件夾的結構就是如下圖所示。
完成后返回到最初的template目錄,運行conpot --template ./ipmi,conpot就會自動加載ipmi文件夾里的配置文件,生成蜜罐。
0×05 進階配置
Conpot內部添加了很多有用的特性,比如使用隨機數來設置應答時間和應答內容等等。下面介紹一下Conpot配置HTTP協議。在HTTP的配置中,你可以定制Web服務的各種特性,包括控制響應代碼和響應頁面的發生的時間和方式。
首先是進行全局的配置,config里面的變量已經注釋地比較清楚了,update_header_date是用來在HTTP的響應header里面加入時間的功能,要和下面的date一起配合著用,tarpit是為了模擬工控系統低性能而設置的響應延遲。
<global><config><!-- what protocol shall we use by default? --><entity name="protocol_version">HTTP/1.1</entity><!-- if we find any date header to be delivered, should we update it to a real value? --><entity name="update_header_date">true</entity><!-- should we disable the HTTP HEAD method? --><entity name="disable_method_head">false</entity><!-- should we disable the HTTP TRACE method? --><entity name="disable_method_trace">false</entity><!-- should we disable the HTTP OPTIONS method? --><entity name="disable_method_options">false</entity><!-- TARPIT: how much latency should we introduce to any response by default? --><entity name="tarpit">0</entity></config><!-- these headers will be sent with each response --><headers><!-- this date header will be updated, if enabled above --><entity name="Date">Sat, 28 Apr 1984 07:30:00 GMT</entity></headers> </global>進行了全局的配置以后,下面是配置htdocs,類似于寫常用的Web路由,每一個node都相當于在配置一個URL,可以進行302跳轉或者是返回html頁面,所以在這里面可以具體地配置每個URL。同時也能在node內定義tarpit,如果在具體的node中定義了tarpit,那么這個延遲將會在這個node中覆蓋之前在全局的定義
<!-- how should the different URI requests be handled --> <htdocs><node name="/"><!-- force response status code to 302 --><status>302</status><headers><!-- these headers will be sent along with this response --><entity name="Content-Type">text/html</entity><entity name="Location">/index.html</entity></headers></node><node name="/index.html"><!-- this tarpit will override the globally set tarpit for this node --><tarpit>0.0;0.3</tarpit><headers><entity name="Last-Modified">Tue, 19 May 1993 09:00:00 GMT</entity><entity name="Content-Type">text/html</entity><entity name="Set-cookie">path=/</entity></headers></node> </htdocs>以上就是node中比較常用的配置方法了,下面是狀態碼的配置,這里的配置和上面的htdocs比較類似,可以直接參照node中的設置來對status進行設置。需要注意的是,錯誤的狀態碼進行響應時不應該設置延遲。
<statuscodes><status name="400"><!-- 400 (BAD REQUEST) errors should be super fast and responsive --><tarpit>0</tarpit><entity name="Content-Type">text/html</entity></status> </statuscodes>0×06 吐槽和瞎扯
Conpot作為一個非常容易上手的工控蜜罐,比較適合用來練練手,而且部署也非常方便,只要自己寫一個dockerfile就能夠批量部署了。但是如果攻擊者有做過anti-honeypot的相關研究,這種低交互的蜜罐還是很容易被識破的,這個項目的issue中就有對這一點的吐槽和嘲諷。
但是這種低交互的蜜罐絕不是沒有用的,在一些特定場景下,這種低交互的蜜罐能夠完成很多高交互蜜罐沒法完成的工作。比如說在生產環境中配置高交互蜜罐和低交互蜜罐混合在一起的蜜網,然后通過低交互的蜜罐迷惑攻擊者,讓攻擊者誤以為高交互蜜罐是生產環境。在這種情況下,低交互蜜罐同樣是起到了攻擊欺騙的作用,但是這種欺騙又脫離了狹義上的攻擊欺騙的范疇,可以說是非常套路了。
另外一個方面的優勢在于,這種低交互的蜜罐不管是開發成本還是部署成本都是非常低的。做到大規模的部署,讓它去捕捉攻擊者的試探行為本身就能作為威脅情報體系的一部分。我在32核/32G的服務器上,嘗試部署了150個蜜罐,系統的內存占用仍然在一個較低的水平,因此,只要分別給這150個容器分發IP,它們直接就能組成蜜網。如果對這些設備進行精細化的配置,就可以復制出一整套生產環境,能夠產生更強的迷惑性,提供更具價值的威脅情報信息。下面這個圖就是我在服務器上運行conpot容器的截圖,實際上,穩定之后CPU的占用很小,內存占用大約在14GB左右,這種資源的使用仍然是可以接受的,可以使用一些TCP端口轉發的工具,把這些蜜罐暴露在公網中。
我們往往需要部署多個蜜罐形成蜜網,用虛擬機的硬件消耗不太劃算,所以說這時候部署在 Docker 上就非常有必要了。我在上一篇博客中已經嘗試在一臺 32 核 32GB 服務器上部署了150個 Pre-Build Conpot 容器, CPU 占用微乎其微,內存占用大約在 14GB 左右。對于大規模的部署,這種資源占用程度是可以接受的。下面這幅圖從實現架構上介紹了 Docker 相對于虛擬機的優勢,我覺得 Docker 有一個很棒的優勢就是在于較低資源占用下提供了容器間資源隔離。
官方提供了一個 Pre-Build 的鏡像,但是直接使用這個只能實現比較有限的功能,同時也不支持蜜罐模板的定制和日志的配置,所以這時候就需要自己擼 Dockerfile ,編譯鏡像了,但是不用像做官方的 Dockerfile 那么麻煩,可以基于 Pre-Build 鏡像修改。
這幅圖展示了一個比較典型的工業生產環境(圖片來自Logix),包括一些功能模塊([變頻]風扇單元、[變頻]壓縮機等)、PLC控制模塊。希望能和大家一起,通過學習這個系列的文章,初步實現大型工控蜜網的自動化部署。
0×02 開始之前
0×03 定個小目標:先做一個能用的 Docker 鏡像
先前說了,官方是有提供一個 Dockerfile 的,但是里面有點問題(比如使用國外源導致的網絡中斷,然后整個鏡像就沒法編譯),官方的 Dockerfile 是基于 python:2 鏡像做的,然后下載依賴、編譯源碼、測試,過程有點麻煩,而且因為網絡問題,安裝依賴需要很長時間。我把官方的 Pre-Build 鏡像傳到了網易蜂巢上,可以直接拉取網易源(hub.c.163.com/mapchuan/conpot:latest),也可以改成 honeynet/conpot 使用官方源。如果使用Docker的頻率比較大,可以考慮在本地部署私有鏡像倉庫服務,提高鏡像拉取的速度。最后要說明的是,在這里我是假定大家已經做好模板,如果還沒做,可以先用官方的模板文件代替。
我們下載官方的repo,提取出./conpot/template/default模板文件夾,并將文件夾重命名為 mytemplate ,大家可以根據實際情況做出修改。
# 在Conpot鏡像基礎上修改 # 官方源: FROM honeynet/conpot # 網易源:FROM hub.c.163.com/mapchuan/conpot:latest FROM hub.c.163.com/mapchuan/conpot:latest# 維護者信息 MAINTAINER mpc@besti# 導入模板文件 RUN mkdir /opt/conpot/template COPY ./ /opt/conpot/template# 切換工作目錄 WORKDIR /opt/conpot/template# 根據需要發布端口 EXPOSE 80# 指定自定義模板,--template ./mytemplate表示以mytemplate為模板生成蜜罐 CMD ["/usr/local/bin/conpot", "--template", "./mytemplate", "--logfile", "/var/log/conpot/conpot.log"]]完成Dockerfile后,在conpot文件夾中運行docker build -t conpot .編譯鏡像。
運行docker run -it -p 80:80 conpot就OK啦。
0×04 日志采集
既然考慮進行大規模的部署,像我們剛才做的鏡像那樣那樣直接輸出到屏幕顯然是不合理的, Conpot 提供了多種日志收集的途徑, Conpot 在 conpot.cfg 文件中配置了默認日志輸出形式,用戶可以通過修改 conpot.cfg 文件來自定義日志收集的配置。
[json] enabled = False filename = /var/log/conpot.json[sqlite] enabled = False[mysql] enabled = False device = /tmp/mysql.sock host = localhost port = 3306 db = conpot username = conpot passphrase = conpot socket = tcp ; tcp (sends to host:port), dev (sends to mysql device/socket file)[syslog] enabled = False device = /dev/log host = localhost port = 514 facility = local0 socket = dev ; udp (sends to host:port), dev (sends to device)[hpfriends] enabled = False host = hpfriends.honeycloud.net port = 20000 ident = 3Ykf9Znv secret = 4nFRhpm44QkG9cvD channels = ["conpot.events", ][taxii] enabled = False host = taxiitest.mitre.org port = 80 inbox_path = /services/inbox/default/ use_https = False可以看到,在 Conpot 中,我們可以使用 json 、 sqlite 、 mysql 、 syslog 、 hpfriends 和 taxii 等幾種方式輸出訪問日志。
你可以在 honeynet 注冊一個hpfriends賬號,成為一名志愿者,將蜜罐日志上傳到 honeynet ,為安全研究人員提供最新的威脅信息。
現在這個網頁已經掛了,如果有需要可以自行搭建中心 hpfriends server ,收集來自設備的日志。
sqlite 文件存儲在 ./logs/conpot.db ,MySQL 和 syslog 的?
device 變量是從設備中獲取連接,但是在容器中,一般不會用到這個feature,注意把socket設為udp/tcp即可。
如果有什么不清楚的,可以在 Conpot 的?logger 文件夾中看看日志輸出的具體實現,源碼的可讀性比較高。這個項目整體上耦合度不高,所以能夠比較容易地基于源代碼二次開發,對接自己的日志收集系統。
0×05 進階!改進我們的 Docker image
雖然剛才我們已經初步寫出了自己的 Docker image ,但是現在仍然是一個玩具,距離真正的部署還有一定距離,我們可以嘗試著進一步改進剛才的 Dockerfile 。
先要修改 conpot 運行的 cfg 文件
[common] sensorid = default[session] timeout = 30[daemon] ;user = conpot ;group = conpot[json] enabled = False filename = /var/log/conpot.json[sqlite] enabled = False[mysql] enabled = True device = /tmp/mysql.sock host = 172.16.43.116 port = 30005 db = conpot username = root passphrase = root socket = tcp ; tcp (sends to host:port), dev (sends to mysql device/socket file)[syslog] enabled = False device = /dev/log host = localhost port = 514 facility = local0 socket = dev ; udp (sends to host:port), dev (sends to device)[hpfriends] enabled = False host = hpfriends.honeycloud.net port = 20000 ident = 3Ykf9Znv secret = 4nFRhpm44QkG9cvD channels = ["conpot.events", ][taxii] enabled = False host = taxiitest.mitre.org port = 80 inbox_path = /services/inbox/default/ use_https = False[fetch_public_ip] enabled = True urls = ["http://whatismyip.akamai.com/", "http://wgetip.com/"][change_mac_addr] enabled = False iface = eth0 addr = 00:de:ad:be:ef:00我在這里是讓 conpot 把數據存儲在 MySQL 容器中,將 enabled 改為 True ,并根據實際情況填寫數據庫的 IP 、端口、用戶名、密碼等信息,如果有多個節點,還需要修改 sensorid ,下圖展示了當前文件夾中的文件。
我們現在開始寫 Dockerfile ,基本上還是在前面的 Dockerfile 里面加一些功能。
# 在Conpot鏡像基礎上修改 # 官方源: FROM honeynet/conpot # 網易源:FROM hub.c.163.com/mapchuan/conpot:latest FROM hub.c.163.com/mapchuan/conpot:latest# 維護者信息 MAINTAINER mpc@besti# 導入模板文件 RUN mkdir /opt/conpot/template COPY ./ /opt/conpot/template# 切換工作目錄 WORKDIR /opt/conpot/template# 根據需要發布端口 EXPOSE 80# 指定自定義模板,--template ./mytemplate表示以mytemplate為模板生成蜜罐,加入--config,指定配置文件 CMD ["/usr/local/bin/conpot", "--template", "./mytemplate", "--logfile", "/var/log/conpot/conpot.log","--config","conpot.cfg"]]運行 conpot ,訪問容器的80端口,用 Navicat 連接 MySQL ,可以看到, conpot 已經在 conpot 數據庫新建了 events 表,并添加了我們剛才的訪問記錄。
0×06 更多玩法?
Now this is not the end. It is not even the beginning of the end. But it is, perhaps, the end of the beginning. ——Churchill
剛才已經基本上完成了 Conpot 蜜罐的部署和日志收集工作,但是現在很多操作比如 conpot.cfg 和 Dockerfile 的編寫都需要手動一個個操作,距離大規模的部署仍然還有些距離,我們希望程序能夠幫助我們完成 sensorid 、 conpot.cfg 和蜜罐模板的自動分發,在收集到攻擊數據后如何挖掘,怎樣與其他的安全系統產生聯動······如果不出意外的話,我將在下一篇博客和大家進行更深入的研究。
我的博客是?https://pingch.top?,上面可以找到我的信息和聯系方式,歡迎交流
總結
以上是生活随笔為你收集整理的工控蜜罐Conpot部署和入门及高级演变的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pymongo 的使用实例(超细)
- 下一篇: ip地址互转十进制数字(函数)