conpot是一个ICS(工业控制系统)蜜罐, 旨在收集攻击者针对工业控制系统的攻击方法和动机. 这篇文章主要用来说明conpot的用户定制相关的一些配置. (英文原文详见: https://github.com/mushorg/conpot/blob/master/docs/source/usage/usage.rst)
conpot附带了一个默认的配置文件, 它可以实现对安装有基本扩展模块的西门子S7-200 PLC的仿真. 这个默认仿真的攻击面包括: MODBUS, HTTP, SNMP and s7comm. 为了避免混乱, conpot的大部分配置是在XML文件中, 也有一些是保存在不同文件夹的templates文件夹下.
MOSBUS
配置文件的 <device_info /> 部分允许用户定义设备的信息并可以作为函数调用返回. <slave /> 部分允许用户将每个从设备(slave)都定义在一个 <blocks /> 中. 二进制输出块: COILS , 二进制输入块: DISCRETE_INPUTS , 用户只需定义它们的起始地址和数据规模. ANALOG_INPUTS 以字节为单位保存数据.
1 <block name="a"> 2 <!-- COILS/DISCRETE_OUTPUTS aka. binary output, power on/power off 3 Here we map modbus addresses 1 to 127 to S7-200 PLC Addresses Q0.0 to Q15.7 --> 4 <type>COILS</type> 5 <starting_address>1</starting_address> 6 <size>128</size> 7 <values> 8 <value> 9 <address>1</address> 10 <!-- Will be parsed with eval() --> 11 <content>[random.randint(0,1) for b in range(0,128)]</content> 12 </value> 13 </values> 14 </block>
如上边代码段中所示, 在 <values /> 部分用户可以设置起始地址和内容部分, 由于内容部分的值都是预测的所以用户可以将其设置为随机值. 保持寄存器 HOLDING_REGISTERS 可以被看作一个临时数据存储区, 同样可以通过起始地址和数据规模来定义它, 而且保持寄存器不需要赋予初始值.
SNMP
在配置文件的 <snmp /> 部分, 你可以用 <symbol> 和一个name属性定义一个信息管理库(MIB) .
1 <symbol name="sysDescr"> 2 <value>Siemens, SIMATIC, S7-200</value> 3 </symbol>
在conpot中包含信息库的流程如下所示: (例如, 从IF-MIB中引入ifNumber)
1. 下载IF-MIB和IANAifType-MIB (IF-MIB的依赖包);
1 wget http://www.iana.org/assignments/ianaiftype-mib/ianaiftype-mib 2 wget ftp://ftp.cisco.com/pub/mibs/v2/IF-MIB.my
2. Conpot会自动编译MIB文件, 但需要使用 '-a' 参数指定存放MIB文件夹的路径;
1 sudo conpot -t my_custom_template.xml -a /opt/mymibs
3. 在MIB配置文件模板中加入用户自定义的snmp配置.
1 <mib name="IF-MIB"> 2 <symbol name="ifNumber"> 3 <value>2</value> 4 </symbol> 5 </mib>
HTTP
在配置文件的 <http> 部分, 用户可以配置conpot的web server的特性, 以及用相应的header和behaviour来控制每个网页和资源的访问特性. 还可以控制相应的错误代码和错误页面的传输方式以及何时传输.
全局 http 的配置:
1 <global> 2 <config> 3 <!-- what protocol shall we use by default? --> 4 <entity name="protocol_version">HTTP/1.1</entity> 5 <!-- if we find any date header to be delivered, should we update it to a real value? --> 6 <entity name="update_header_date">true</entity> 7 <!-- should we disable the HTTP HEAD method? --> 8 <entity name="disable_method_head">false</entity> 9 <!-- should we disable the HTTP TRACE method? --> 10 <entity name="disable_method_trace">false</entity> 11 <!-- should we disable the HTTP OPTIONS method? --> 12 <entity name="disable_method_options">false</entity> 13 <!-- TARPIT: how much latency should we introduce to any response by default? --> 14 <entity name="tarpit">0</entity> 15 </config> 16 17 <!-- these headers will be sent with each response --> 18 <headers> 19 <!-- this date header will be updated, if enabled above --> 20 <entity name="Date">Sat, 28 Apr 1984 07:30:00 GMT</entity> 21 </headers> 22 </global>
如上所示, 从注释中可以很清楚的理解每条xml配置语句的作用:
- disable_method : 失能对应条目代表的特性;
- headers : globle部分的headers会被加载到被传递的每个页面上, 它可以被每个页面定义的具有相同名字的headers重写;
- tarpit : 限制页面的传输速度; 这样做是为了模拟那些较慢的设备, tarpit的值是以秒和毫秒指定的;
我们还通过引入别名(alias)的方式来增加配置的灵活性. 使用别名非常方便, 用户可以通过指定别名来代表其它已经配置好的资源, 从而使conpot执行响应的操作而无需重新定义所有配置项.
1 <node name="/index.htm"> 2 <!-- this node will inherit the payload from the referenced alias node without telling the browser --> 3 <alias>/index.html</alias> 4 </node>
以上的配置通过别名的方式使浏览器对 ' /index.htm ' 的http请求全部以已经定义好的 ' /index.html ' 来进行响应. 并且浏览器不会察觉到这些内部的转换, 因为这些内部的转换都是由conpot单独完成的. 需要注意的是只有单层的alias可以被处理.
动态页面的传输通常是采用块传输编码的方式, <chunks> 指令使能块传输编码, 并且分多个部分来传输一整个个大的数据流. 如下边的配置就是把一个页面分成4个块来传送, 分别是130, 15, 30和110字节. 如果用户配置的传输块的总字节数少于要传输的页面的字节数, conpot会在传输块的末尾自动追加一个包含所有缺失信息的块来完成整个请求. 这些块是按顺序传输的, 并且不会有trapit作用在传输的过程中.
1 <node name="/some_chunked_file.html"> 2 <!-- this feature controls chunked transfer encoding --> 3 <chunks>130,15,30,110</chunks> 4 </node>
如下配置文件所示, 指向页面 ' / ' 的请求将会被重定向到另一个webserver. conpot向这个webserver发出一个请求, 就像后台代理一样, conpot会代表实际产生响应内容的服务器向请求客户端发送响应结果页面, 所以web浏览器将不会察觉到任何异常.
1 <node name="/redirected-page"> 2 <!-- this page is redirected to another web server --> 3 <proxy>10.0.0.100</proxy> 4 </node>
这个特性页可以被应用到状态码. 例如代理重定向被应用到状态码404, 那么所有不能被conpot本身进行处理的请求都会被秘密地转发到另一系统,这个系统可以是一个真实的高交互设备. 如果只有404状态码被配置, 会导致所有的请求都会被转发到其它的webserver. 这样conpot就像是用于HTTP协议的更高交互的terminating honeywall.