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. 剑指offer系列24---数组中重复的数字

    * [24] * [题目]在一个长度为n的数组里的所有数字都在0到n-1的范围内. * 数组中某些数字是重复的,但不知道有几个数字是重复的. * 也不知道每个数字重复几次. * 请找出数组中任意一个重 ...

  2. 105. Construct Binary Tree from Preorder and Inorder Traversal

    Given preorder and inorder traversal of a tree, construct the binary tree. ============== 基本功: 利用前序和 ...

  3. [linux basic]基础--信号

    线程->信号信号,是unix和linux系统响应某些条件而产生的一个事件.接收到该信号的进程会相应地采取一些行动.raise生成表示一个信号的产生catch捕获表示接受到一个信号的产生:信号是由 ...

  4. 黄聪:Discuz!的SEO优化策略二:如何去掉页脚多余的信息

    论坛搭建好,首先是把多余的东西都砍掉. 页脚的信息在我看来,都是很多余的信息,如下图: 要怎么消灭掉它们呢? 1.进入 全局 -- 站点信息 2.站点名称改为你的论坛名称,它会出现在内页的标题最末位. ...

  5. Codeforces Round #363 (Div. 2) One Bomb

    One Bomb 题意: 只有一个炸弹,并且一个只能炸一行和一列的'*',问最后能否炸完所以'*',如果可以输出炸弹坐标 题解: 这题做的时候真的没什么好想法,明知道b题应该不难,但只会瞎写,最后越写 ...

  6. memcpy

    函数原型 void *memcpy(void*dest, const void *src, size_t n); 功能 由src指向地址为起始地址的连续n个字节的数据复制到以destin指向地址为起始 ...

  7. JAVA 主函数(主方法)

    主函数(主方法) 1.public     (访问修饰符,公共的)代表该类或者该方法访问权限是最大的 2.static    代表主函数随着类的加载而加载 3.void    代表主函数没有具体的返回 ...

  8. 使用BeanUtils操作Bean属性

    package com.wzh.test.beanutils; import java.lang.reflect.InvocationTargetException; import java.text ...

  9. iOS使用AVFoundation实现二维码扫描

    原文:http://strivingboy.github.io/blog/2014/11/08/scan-qrcode/ 关于二维码扫描有不少优秀第三方库如: ZBar SDK 里面有详细的文档,相应 ...

  10. C语言位运算符及作用:与、或、异或、取反、左移和右移

    一.& 按位与 如果两个相应的二进制位都为1,则该位的结果值为1,否则为0应用:(1)清零 若想对一个存储单元清零,即使其全部二进制位为0,只要找一个二进制数,其中各个位符合一下条件:原来的数 ...