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 以字节为单位保存数据.

 <block name="a">
<!-- COILS/DISCRETE_OUTPUTS aka. binary output, power on/power off
Here we map modbus addresses 1 to 127 to S7-200 PLC Addresses Q0.0 to Q15.7 -->
<type>COILS</type>
<starting_address>1</starting_address>
<size>128</size>
<values>
<value>
<address>1</address>
<!-- Will be parsed with eval() -->
<content>[random.randint(0,1) for b in range(0,128)]</content>
</value>
</values>
</block>

如上边代码段中所示, 在 <values />  部分用户可以设置起始地址和内容部分, 由于内容部分的值都是预测的所以用户可以将其设置为随机值. 保持寄存器 HOLDING_REGISTERS 可以被看作一个临时数据存储区, 同样可以通过起始地址和数据规模来定义它, 而且保持寄存器不需要赋予初始值.

SNMP

在配置文件的 <snmp /> 部分, 你可以用 <symbol> 和一个name属性定义一个信息管理库(MIB) .

 <symbol name="sysDescr">
<value>Siemens, SIMATIC, S7-200</value>
</symbol>

在conpot中包含信息库的流程如下所示:   (例如, 从IF-MIB中引入ifNumber)

1. 下载IF-MIB和IANAifType-MIB (IF-MIB的依赖包);

 wget http://www.iana.org/assignments/ianaiftype-mib/ianaiftype-mib
wget ftp://ftp.cisco.com/pub/mibs/v2/IF-MIB.my

2. Conpot会自动编译MIB文件, 但需要使用 '-a' 参数指定存放MIB文件夹的路径;

 sudo conpot -t my_custom_template.xml -a /opt/mymibs

3. 在MIB配置文件模板中加入用户自定义的snmp配置.

 <mib name="IF-MIB">
<symbol name="ifNumber">
<value>2</value>
</symbol>
</mib>

HTTP

在配置文件的 <http> 部分, 用户可以配置conpot的web server的特性, 以及用相应的header和behaviour来控制每个网页和资源的访问特性. 还可以控制相应的错误代码和错误页面的传输方式以及何时传输.

全局 http 的配置:

 <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>

如上所示, 从注释中可以很清楚的理解每条xml配置语句的作用:

  • disable_method : 失能对应条目代表的特性;
  • headers : globle部分的headers会被加载到被传递的每个页面上, 它可以被每个页面定义的具有相同名字的headers重写;
  • tarpit : 限制页面的传输速度; 这样做是为了模拟那些较慢的设备, tarpit的值是以秒和毫秒指定的;

  我们还通过引入别名(alias)的方式来增加配置的灵活性.  使用别名非常方便, 用户可以通过指定别名来代表其它已经配置好的资源, 从而使conpot执行响应的操作而无需重新定义所有配置项.

 <node name="/index.htm">
<!-- this node will inherit the payload from the referenced alias node without telling the browser -->
<alias>/index.html</alias>
</node>

以上的配置通过别名的方式使浏览器对 ' /index.htm ' 的http请求全部以已经定义好的 ' /index.html ' 来进行响应. 并且浏览器不会察觉到这些内部的转换, 因为这些内部的转换都是由conpot单独完成的. 需要注意的是只有单层的alias可以被处理.

动态页面的传输通常是采用块传输编码的方式,  <chunks> 指令使能块传输编码, 并且分多个部分来传输一整个个大的数据流. 如下边的配置就是把一个页面分成4个块来传送, 分别是130, 15, 30和110字节. 如果用户配置的传输块的总字节数少于要传输的页面的字节数, conpot会在传输块的末尾自动追加一个包含所有缺失信息的块来完成整个请求. 这些块是按顺序传输的, 并且不会有trapit作用在传输的过程中.

 <node name="/some_chunked_file.html">
<!-- this feature controls chunked transfer encoding -->
<chunks>130,15,30,110</chunks>
</node>

  

如下配置文件所示, 指向页面 ' / ' 的请求将会被重定向到另一个webserver. conpot向这个webserver发出一个请求, 就像后台代理一样, conpot会代表实际产生响应内容的服务器向请求客户端发送响应结果页面, 所以web浏览器将不会察觉到任何异常.

 <node name="/redirected-page">
<!-- this page is redirected to another web server -->
<proxy>10.0.0.100</proxy>
</node>

这个特性页可以被应用到状态码. 例如代理重定向被应用到状态码404, 那么所有不能被conpot本身进行处理的请求都会被秘密地转发到另一系统,这个系统可以是一个真实的高交互设备. 如果只有404状态码被配置, 会导致所有的请求都会被转发到其它的webserver. 这样conpot就像是用于HTTP协议的更高交互的terminating honeywall.

 

conpot_usage简要说明的更多相关文章

  1. JavaScript权威设计--JavaScript函数(简要学习笔记十一)

    1.函数调用的四种方式 第三种:构造函数调用 如果构造函数调用在圆括号内包含一组实参列表,先计算这些实参表达式,然后传入函数内.这和函数调用和方法调用是一致的.但如果构造函数没有形参,JavaScri ...

  2. JavaScript权威设计--JavaScript函数(简要学习笔记十)

    1.函数命名规范 函数命名通常以动词为前缀的词组.通常第一个字符小写.当包含多个单词时,一种约定是将单词以下划线分割,就像"like_Zqz()". 还有一种就是"lik ...

  3. [译]Angular2 和TypeScript -- 一次简要的预览

    原文链接:https://www.infoq.com/articles/Angular2-TypeScript-High-Level-Overview 作者:  Yakov Fain Posted o ...

  4. 内网劫持渗透新姿势:MITMf简要指南

    声明:本文具有一定攻击性,仅作为技术交流和安全教学之用,不要用在除了搭建环境之外的环境. 0×01 题记 又是一年十月一,想到小伙伴们都纷纷出门旅游,皆有美酒佳人相伴,想到这里,不禁潸然泪下.子曰:& ...

  5. markdown简要说明显示样式

    markdown 什么是markdown:     Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式.   Markdown具有一系列 ...

  6. 简要介绍BASE64、MD5、SHA、HMAC几种方法。

    加密解密,曾经是我一个毕业设计的重要组件.在工作了多年以后回想当时那个加密.解密算法,实在是太单纯了.     言归正传,这里我们主要描述Java已经实现的一些加密解密算法,最后介绍数字证书.     ...

  7. Java Reference简要概述

    @(Java)[Reference] Java Reference简要概述 Reference对象封装了其它对象的引用,可以和普通的对象一样操作. Java提供了四种不同类型的引用,引用级别从高到低分 ...

  8. 转载:谈谈Unicode编码,简要解释UCS、UTF、BMP、BOM等名词

    转载: 谈谈Unicode编码,简要解释UCS.UTF.BMP.BOM等名词 这是一篇程序员写给程序员的趣味读物.所谓趣味是指可以比较轻松地了解一些原来不清楚的概念,增进知识,类似于打RPG游戏的升级 ...

  9. maven命令参考简要

    命令参考简要说明 mvn archetype:generate — 创建生成Tiny骨架工程 参数名 说明 groupId 用户项目的包目录,用户需要根据实际情况设置.比如com.abc artifa ...

随机推荐

  1. android 插件化开发 开源项目列表

    开源的插件化框架 Qihoo360/DroidPlugin CtripMobile/DynamicAPK mmin18/AndroidDynamicLoader singwhatiwanna/dyna ...

  2. 【oracle】数据库、表空间、用户、数据表之间的关系

    来自为知笔记(Wiz) 附件列表 新建_032515_030437_PM.jpg

  3. Python哈希函数hashlib

    hashlib常用加密方法:md5(), sha1(), sha224(), sha356(), sha384(), sha512()等 结果显示方法: digest():    返回二进制字符串 h ...

  4. rpm包安装时发现缺少其他依赖

    多年来一直困扰我的问题,就是当我们下载了一个rpm包来安装的时候发现缺少依赖.以前的做法是网上挨个去搜索依赖的rpm,然后依次安装. # rpm -ivh google-chrome-stable_c ...

  5. 《黄聪:手机移动站SEO优化教程》1、为什么要做手机移动端网站

    视频地址:http://v.youku.com/v_show/id_XNzE2Mzk3MjI4.html

  6. 类(class)、构造函数(constructor)、原型(prototype)

    类 Class 类的概念应该是面向对象语言的一个特色,但是JavaScript并不像Java,C++等高级语言那样拥有正式的类,而是多数通过构造器以及原型方式来仿造实现.在讨论构造器和原型方法前,我可 ...

  7. java获取任意日期

    现有两个办法 1:Date as = new Date(new Date().getTime()-24*60*60*1000);  SimpleDateFormat matter1 = new Sim ...

  8. QT学习之路---信号槽

    #include<QApplication> #include<QPushButton> int main(int argc,char *argv[]) { QApplicat ...

  9. struts (四) path DMI

    1.path 常使用绝对路径 path = request.getContextPath(); basepath = request.getscheme+"://"+request ...

  10. poj 2299 Ultra-QuickSort :归并排序求逆序数

    点击打开链接 Ultra-QuickSort Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 34676   Accepted ...