0

Sulley Fuzzing Framework を使用して BACNet デバイスをファジングしようとしています。

フレームワークを理解するために、このかなり単純な例を書きましたが、うまくいきません。

from sulley import *

s_initialize("Test")

s_static(0x10, "Something")
s_byte(0x00, "SomeByte")

sess = sessions.session(proto="UDP")

sess.connect(sulley.s_get("Test"))

target = sessions.target("192.168.1.3", 0xBAC0)

target.netmon    = None
target.procmon   = None
target.vmcontrol = None

sess.add_target(target)
sess.fuzz()

しかし、それを実行すると、次の出力が得られます

pydev debugger: starting (pid: 3356)
[2015-11-09 09:40:54,351] [INFO] -> current fuzz path:  -> Test
[2015-11-09 09:40:54,352] [INFO] -> fuzzed 0 of 112 total cases
[2015-11-09 09:40:54,354] [INFO] -> fuzzing 1 of 112
[2015-11-09 09:40:54,354] [INFO] -> xmitting: [1.1]
[2015-11-09 09:40:54,355] [CRITICAL] -> failed transmitting fuzz node
Exception caught: TypeError("cannot concatenate 'str' and 'int' objects",)
Restarting target and trying again
[2015-11-09 09:40:54,355] [ERROR] -> no vmcontrol or procmon channel available ... sleeping for 300 seconds

netmon, procmon, vmcontrolに設定したことが問題かもしれないと思いますが、Noneそれらを省略するだけで同じ出力が得られます。とにかく後でファジングしたいデバイスにそれらを使用できないため、これらのモニターを作成していません。パケットを送信して、何が起こるかを確認したいだけです。では、これらのモニターなしで Sulley を使用することは不可能ですか、それとも私のコードに何か問題がありますか?

4

2 に答える 2

1

さて、モニターなしでファジングできることがわかりました。s_static()Sulley は、関数内の整数値が気に入らないようです。それがエラーの原因でもあります。文字列である必要があります。お気に入りs_static("00", "static")

于 2015-11-09T11:48:20.480 に答える
1

後でファジングしたいデバイスのモニターを使用できないことを知っています。ただし、ファジング スクリプトを実行する攻撃者のマシン上でネットワーク モニターが実行されるため、ネットワーク モニターは実行できるはずです。

プロセス モニターについては、.../sully/sully/instrumentation.py にある外部モニター/instrumentation を使用することをお勧めします。ドキュメントは次の場所にあります: .../sully/docs/index.html

「ある種のターゲット (組み込みデバイスなど) はデバッガーをサポートしておらず、これらのケースではプロセス モニター エージェントを使用できません。外部計測クラスを使用すると、外部コマンドを呼び出して障害を検出し、ターゲットを再起動できます。SSH次の例では を使用していますが、任意の python 関数または外部スクリプトを使用できます:"

import os

def ssh_is_alive():
    '''Check that the target is alive. Called after each test case. Return True if alive, False otherwise'''

    _, stdout = os.popen2('ssh %s pidof target' % IP_DST)
    pid = stdout.read()
    return pid != ''

def ssh_restart():
    '''Restart the target. Called when instrumentation (post) fail.'''

    os.popen2('ssh %s /etc/init.d/target restart' % IP_DST)

sess           = sessions.session()
target         = sessions.target(IP_DST, PORT_DST)
target.procmon = instrumentation.external(post=ssh_is_alive, start=ssh_restart)
sess.add_target(target)
sess.connect(s_get('node'))
sess.fuzz()
于 2016-07-12T12:12:44.380 に答える