中国のJovisionカメラとそのOEMクローン。 セキュリティデマ

そのため、プロジェクトの1つで、ターゲット指定子の空間的位置を制御するシステムが必要になりました。 さまざまなメーカーのサーボドライブは非常に高価であることが判明したため、制御カメラを購入し、内蔵カメラサーボを使用して位置決めすることにしました。 私はPTZカメラとは何の関係もなかったので、テストのためにロシアのメーカー3C-GroupのJ2000IP-CmPTZ-111v2.0カメラを購入しました。







注意! この出版物はカメラの概要ではなく、機器メーカーが提供するカメラ制御メカニズムの分析、およびその使用の安全性の評価について説明している可能性が高いです。







J2000IP-CmPTZ-111v2.0カメラは、 Jovision JVS-H411でもあります。 傑出したカメラホームセグメントはありません。 ほとんどのカメラと同様に、 HiSilicon 3518Eチップ上に構築されています。







画像

チップは非常に一般的であり、SDKがあるので、組み立てられたコアの上にあるメーカーは特定のサービスを上から「巻き上げ」始めます。 ファームウェアデバイスは通常、異なるドライバーのwifiモジュールです。 Wifiモジュールは、アドレスhttp://www.jovecloud.com/ipc/3518es/から取得したファームウェアの名前から決定できます







jvs3518es-7601.bin-Ralink RT7601

jvs3518es-8188.bin-Realtek RTL8188

jvs3518es-9271.bin-Atheros AR9271







jvs3518es-7601.binデバイスのファームウェアは、次のJovisionデバイスのリストに対して有効です。







H411 J2000IP-CmPTZ-111-V2.0 H411V1_1 H411S-H1 H411V2 HC420S-H2 HC520D-H1 HC420-H2 H411-H1 H411KEDA AT-15H2 SW-H411V3 HZD-600DM AJL-H40610-S1 AJL-H40610-S2 JD-H40810
      
      





だから。 モデルを決定しました。 これはロシアの開発ではなく、3Cグループの会社が位置付けているため、中国の大手メーカーのOEMカメラクローンにすぎません。







ただし、クローンであり、ファームウェアが中国語の場合、そのサービスも中国語で保護されます。 原則としてそうです。 カメラは、P2P接続であるJovisionクラウドへの登録を意味し、携帯電話で画像を表示し、カメラをリモートで制御できます。 サードパーティのセキュリティサービス、特に中国語、特にビデオを信頼しないシステム管理者と同様に、最初に行うことをお勧めすることは、カメラをデフォルトゲートウェイ自体に設定し、他の管理方法を使用することです。







カメラのリモートコントロール用に、製造元はIE(ローカルネットワークからの制御用)およびAndroidアプリケーション(インターネット上の制御用)にOCX機器を提供しています。 このカメラはUnixシステムで使用するように計画されていたため、IEとAndroidのオプションは使用条件に適合しなかったため、なくなりました。







多かれ少なかれアクセス可能なAPIがネットワーク上で見つからなかったため、利用可能なAPIを元に戻し始めました。 判明したOCXスナップインは、2つの制御オプションを使用します。







  1. クローズドIPCプロトコルによる管理。
  2. 組み込みのthttpdサーバーによる管理。


最初のオプションは最初に除外されました(その後、楽しみのために戻されました)。 プロプライエタリプロトコルの逆変換には長い時間がかかる可能性があり、2番目のオプションを掘り始めました。 すべてのカメラリクエストが1つのURLに送信されることが判明しました







 http://<camip>/cgi-bin/jvsweb.cgi
      
      





当然、おそらくさまざまなセキュリティデバイスにあるはずです-デバイスへのアクセスは、次のようなユーザー名とパスワードで閉じる必要があります。







 http://<camip>/cgi-bin/jvsweb.cgi?username=admin&password=password
      
      





その後、管理チームが従う必要があります。 しかし、ファームウェアの内部に到達した後、jvsweb.cgiファイルの内容に非常に驚いた







 #!/bin/sh eval `./proccgi` echo Content-type: application/json #echo #echo $FORM_cmd #echo $FORM_action #echo $FORM_param #echo $FORM_username #echo $FORM_password #echo ./wagent $FORM_cmd $FORM_action "$FORM_param" $FORM_username $FORM_password
      
      





小さなproccgiプログラムは、サーバーへのWeb要求を解析し、変数に変換します。変数はエージェントによってプログラムに「供給」され、エージェントはこのデータを制御プログラムに転送します。







調査が示したように、ユーザー名とパスワードのフィールドは、単語ALLの何にも影響しません。 重要なのは最初の3つのパラメーターのみです。







主なことは、これからすべての読者に伝えたいことです。カメラは安全です! 誰でも同じネットワーク上でそれを制御できます。 私たちは研究を続けています。 telnet(デフォルトのアドレスは192.8.8.8)を介してカメラに接続するには、固定ログインとパスワードroot / jvbzdを使用します。これ従来の方法では変更できません !!!!







繰り返しますが、誰でも接続できます。 このため、最初にしたことは、カメラのクラウドへのアクセスを削除することでした。 基本的なセキュリティポリシーがすぐに侵害された場合、それよりも高いものを信頼しても意味がありません。







もっと深くなろう。 カメラをロードするプロセスは、カーネルのロード、システムの基本設定の読み取り、ポートスニファーの起動、および管理プログラム自体の起動で構成されます。 最初の2つの段落ですべてが明確な場合、3番目の段落で問題が発生します。

ポートインターセプターは、サービス用に厳密に予約されているポートのリストに基づいて、ビジー状態をチェックし、自分用に予約します。 制御プログラムは、静的にコンパイルされた5メガバイトのバイナリで、すべてのカメラ制御ロジックが「保護」されています。







カメラコアにはウォッチドッグが組み込まれており、適切なタイミングで制御プログラムからライブ信号が届かない場合、カメラは自動的に再起動します。







デバッグモードでカメラを起動するには、3つの手順を実行する必要があります。







  1. カメラを再起動し、再起動の開始後5秒以内にtelnetでカメラにアクセスします
  2. ps wを起動し、killプロセスのstartup.shおよび/ tmp / sctrlを使用して強制終了します。 startup.shは「最初に撮影」する必要があります / tmp / sctrlの先頭に続く行再起動コマンドです
  3. キーで/ tmp / sctrlを実行します。

    • cmd = 0/1-制御システムのコマンドインターフェイスを有効にします
    • debug = 0/1-高度なデバッグを有効にする


これらのすべての手順は、ウォッチドッグが機能する前に10〜15秒で完了する必要があります。 管理プログラムを開始すると、作業ログと、受信コマンドの処理ログが表示されます。

管理プログラムはいくつかの部分に分かれています。







  1. ipc制御モジュール
  2. http制御モジュール
  3. クラウド接続モジュール
  4. 互換性のあるネットワークデバイス検出モジュール
  5. onvifインターフェース制御モジュール


ipc制御モジュールは常に実行されており、ポート9101でコマンドを待機しています

http制御モジュールは無料のthttpdサーバーに実装され、継続的に動作し、ポート80でコマンドをリッスンします

クラウド接続モジュールは、10秒ごとに接続を確認します。

ネットワークデバイス検出モジュールがレコーダーを見つけようとしています

onvifインターフェース制御モジュールは、thttpdと連携して動作し、非常に湾曲した管理サポートを提供します。







はい! 書くのを忘れました。 カメラはクライアントとカメラ間のトラフィック暗号化を提供しますが、!!! 暗号化キーはすべてのファームウェアで同じであり、ファイル/ tmp / encryptにあります !!!







悲しい質問を捨てて、カメラの制御に戻りましょう。 Webインターフェイスを介して受信したすべてのデータは、透過的に制御モジュールに送信されます。 制御モジュールは、コマンドの処理を担当する多数のサブルーチンで構成されています。 残念ながら、開発者は、制御プログラムのコードは誰にとっても興味深いものではないと判断し、カメラ状態制御ルーチン、メモリ管理ルーチン、プロシージャコール、および制御システム自体の状態と同じバスケットに入れました。







制御ルーチンのリストは、リクエストを通じて取得できます







 http://<camip>/cgi-bin/jvsweb.cgi?cmd=webhelp
      
      





すべてのカメラコントロールユニットのリストを以下に示します







 cmd list and help information mptz mptz zoom [X] [Y] [ZOOM] timer display all timer list stream for stream test account account operation cmd webalarm alarm operation command webmdetect motion detect operation command webprivacy privacy operation command webrecord record operation command webstorage storage operation command webstream stream operation command webifconfig ifconfig operation command webwifi wifi operation command webosd osd operation command websnapshot Have a snapshot of the channel webhelp Display help info webipcinfo ipcinfo operation command webdevinfo webdevinfo operation command webimage image operation command yst yst operation command system websystem operation command multimedia multimedia operation command ptz ptz operation command webaudio webaudio operation command redirect redirect stdout stderror webled led control command webad audio detect wdtoff Manual close watchdog
      
      





私の主な仕事はカメラの明確な位置決めを確保することでしたが、残念ながら製品のソフトウェア実装のため、これは不可能であることが判明しました。 なんで?







PTZキネマティクス制御インターフェイスはRS485を介して機能し、現在のカメラ位置を決定する外部センサーとカウンターはありません。 コマンドをPTZに送信するインターフェースは、エンジンを正しい方向に回す必要があるステップをカーネルモジュールに転送します。 作業セクターを決定するために、初期初期化中に、カメラは両方の軸でゼロ位置に回転し、座標が増加する方向に回転を開始します。 水平座標の回転セクターの終了を決定すると、カメラは結果のセクターを65536で除算します。垂直座標でも同じことが起こります。 したがって、内部座標グリッドが取得され、それに基づいてカメラが配置されます。 制御インターフェイスを使用してカメラに回転コマンドを送信すると、ユーザーがアクセスできない内部カウンターのみがカウントされ、カメラに保存されます。 プリセットを保存するとき、制御プログラムはカメラが現在配置されている現在の座標を保存してから、位置決めに使用します。 ユーザーは、明確なポイント配置を利用できません。







しかし、これはあきらめる時ではありません:)私たちはカメラの能力を掘り下げ続けます。 cJSONライブラリーは制御インターフェースへの入力を解析するため、param変数に有効なJSON構造が必要です。







クエリ文字列は常に次のようになります。







 http://<camip>/cgi-bin/jvsweb.cgi?cmd=<cmd>&action=<action>&param={"key1":"value1","key2":"value2"}
      
      





このリクエストでは、カメラは通常、結果に応じて複数のラインを返します。







 {"status":"ok","data":""} {"status":"param error","data":""} param error    
      
      





見つけたすべての制御コマンドとそれらのフィールド/パラメーターに署名します。 中括弧で示されたデータには、リクエストのparamフィールドに配置する必要があるデータが含まれています。 ほとんどのコマンドは、現在の設定を表示するaction = listをサポートしています。 accountコマンドから始めましょう。









システムWebインターフェースのユーザー管理







  list # List all account with passwords add: # add account {"acID": "aborche","acPW": "123","acDescript":"test","Power":17} check: # check password {"acID":"aborche","acPW":"123"} modify: # modify account {"acID":"aborche","acOldPW":"123","acNewPW":"1234"} del: # delete account {"acID":"aborche1"} count # count accounts
      
      





したがって、アカウント要求のリストは次のようになります







 http://<camip>/cgi-bin/jvsweb.cgi?cmd=account&action=list
      
      





ユーザーの追加







 http://<camip>/cgi-bin/jvsweb.cgi?cmd=account&action=add&param={"acID": "aborche","acPW": "123","acDescript":"test","Power":17}
      
      







モーション検出器アラート







  list # List all alarms set: # Set alarm {"delay":10,"sender":"ipcmail@163.com","server":"smtp.163.com","username":"ipcmail","passwd":"ipcam71a", "receiver0":"lfx@jovision.com","receiver1":"(null)","receiver2":"(null)","receiver3":"(null)"}
      
      





これら2つのチームについて少し説明します。 カメラから受信したデータはすべて公開されており、ユーザー名とパスワードなしでアクセスできます! したがって、メールボックスへのアクセスを失いたくない場合(例として)、注意して2番目のメールボックスを開いてください。









動体検知







  <ch> list # List motion detects # cmd=webmdetect&action=1 list # cmd=webmdetect 1&action=list <ch> set: {"bEnable":0,"nSensitivity":50,"nThreshold":15,"nRectNum":0, "stRect":[{"x":0,"y":0","w":0,"h":0}, {"x":0,"y":0,"w":0,"h":0}, {"x":0,"y":0,"w":0,"h":0}, {"x":0,"y":0,"w":0,"h":0}], "nDelay":10,"nStart":0,"bOutClient":0,"bOutEMail":0}
      
      





入力パラメーターの解析の曲率により、任意のパラメーターで任意の長さのコマンドを自由に送信できることに注意してください。 カメラには複数のチャンネル(ビデオストリーム)があるため、一部のコマンドにはチャンネル番号を指定できます。









ブロードキャストする必要がない画像にプライバシーゾーンを定義する







  <ch> list # List privacy zones # cmd=webprivacy&action=1 list # cmd=webprivacy 1&action=list <ch> set: # Set privacy zone {"bEnable":0,"stRect":[{"x":0,"y":0,"w":0,"h":0}, {"x":0,"y":0,"w":0,"h":0}, {"x":0,"y":0,"w":0,"h":0}, {"x":0,"y":0,"w":0,"h":0}]}
      
      







録画設定







  # cmd=webrecord&action=1 list # cmd=webrecord 1&action=list <ch> list # List settings <ch> set: # {"bEnable":1,"file_length":600,"timing_enable":0,"discon_enable":0, "alarm_enable":0,"timing_start":0,"timing_stop":0,"disconnected":0, "detecting":0,"alarming":0,"alarm_pre_record":6,"alarm_duration":10}
      
      







外部メモリカードの内容







  list # List settings format # Format storage
      
      







ストリーム設定







  # cmd=webstream&action=1%20list # cmd=webstream 1&action=list # cmd=webstream -c<chid> <streamid>&action=ability # cmd=webstream -c1 1&action=ability <ch> list # List streams <ch> set: # Set stream settings {"bEnable":1, "bAudioEn":1, "viWidth":1280, "viHeight":720, "width":1280, "height":720, "framerate":20, "bitrate":1024, "ngop_s":4, "rcMode":1, "encLevel":1, "quality":40, "minQP":24, "maxQP":46} <ch> resolution # Get stream possible resolution <ch> ability # Get stream settings requestidr # ?????
      
      







ネットワークインターフェース設定







  list # Get interfaces configuration set: # Set interfaces configuration {"inet":"dhcp", "eth": {"name":"eth0","bDHCP":1,"addr":"","mask":"","gateway":"0.0.0.0", "mac":"02:00:01:01:01:12","dns":"8.8.8.8"}, "pppoe": {"name":"ppp0","username":"x","passwd":"1"}, "wifiap": {"name":"","passwd":"","quality":0,"keystat":0,"iestat":""} } scan # ReScan wifi networks
      
      







WiFiコントロール







  list # List wifi networks connect: # Connect to network {"name":"ZyXEL53", "passwd":"", "quality":2, "keystat":1, "iestat":"\u0004\u0002"} changemode: ????
      
      





webwifiおよびwebifconfigコマンドを使用すると、近くのWIFIネットワークを安全にスキャンして接続できることに注意してください。 したがって、制御下のカメラは環境を静かにスパイできます。









ビデオのカメラIDを管理する







  <ch> list # Get channel info <ch> set: {"bShowOSD":1, "timeFormat":"MM/DD/YYYY hh:mm:ss", "position":1, "timePos":2, "channelName":"HD IPC", "osdbInvColEn":1,"bLargeOSD":1}
      
      







デバイス情報







  list # Get device info set: { "type": "J2000IP-CmPTZ-111-V2.0", "product": "JVS-HI3518ES-7601", "version": "V2.2.4402", "acDevName": "HD IPC", "nickName": "", "sn": 36430, "ystID": xxxxxxxxxx, "nDeviceInfo": [], "nLanguage": 1, "date": "2016-10-22 14:31:43", "bSntp": 1, "sntpInterval": 24, "ntpServer": "192.168.205.1", "enableStreamWatchDog": 1, "tz": 3, "bDST": 0, "bIPSelfAdapt": 1, "rebootDay": 0, "rebootHour": 1, "bRestriction": 1, "portUsed": "8099,554,23,8127,51994,55434,6666,8732,58434,3702,9100,9104,9106,57241,4001,6072,8899,1998,17", "osdText": ["", "", "", "", "", ""], "osdX": 0, "osdY": 0, "osdSize": 32, "lcmsServer": ""} settime <datetime> system <reboot/reset/softreset>
      
      





この機能により、デバイスを再起動またはリセットできます







 http://<camip>/cgi-bin/jvsweb.cgi?cmd=webipcinfo&action=system reboot
      
      







画像設定







  list set: {"contrast": 135, "brightness": 135, "saturation": 135, "sharpen": 255, "exposureMax": 3, "exposureMin": 100000, "scene": 0, "daynightMode": 0, "dayStart": [{ "hour": 6, "minute": 0 }], "dayEnd": [{ "hour": 18, "minute": 0 }], "bEnableAWB": 1, "bEnableMI": 0, "bEnableST": 0, "bEnableNoC": 0, "bEnableWDynamic": 0, "bNightOptimization": 1, "bAutoLowFrameEn": 0}
      
      







リモート管理のストリーム情報







  list set: {"strGroup": "B", "nID": XXXXXXXXX, "nPort": 9101, "nStatus": 2, "bActiving": 1, "nYSTPeriod": 10, "bTransmit": "\u0001", "eLANModel": 0, "bWebServer": 1, "nWebPort": 80, "nPictureType": 3, "nPictureTypeOld": 1} get_port # get control port get_video # get video streams
      
      





このチームについて説明しましょう。 このコマンドは、OCXまたは電話を介したリモートコントロールのビデオストリーム設定を記述します。 2つのチームを除いて、これらのデータが役に立つとは考えられません。







 http://<camip>/cgi-bin/jvsweb.cgi?cmd=yst&action=get_port http://<camip>/cgi-bin/jvsweb.cgi?cmd=yst&action=get_video
      
      





最初のものには、システム管理ポートとポート設定が表示されます。 2番目には、システムで使用可能な現在のビデオストリームが表示されます。 通常、2番目のコマンドの出力は次のようになります。







 rtsp://<camip>/live0.264 rtsp://<camip>/live1.264
      
      







カメラ制御







  move: # range = step(255*x(y)), sign +/- = direction {"chnid":0,"x":[0.01..1],"y":[0.01..1]} x,y - moving speed 0 - stop move move_auto: # set move speed {"chnid":1,"s":0.5} preset: #preset control {"chnid":0,"type":n,"presetid":p,"name":name} type: 0="list" 1="Save Preset" 2="Delete Preset" 3="Apply Preset" param={"chnid":1,"type":1,"presetid":1,"name":"preset 1"} - Save Preset 1 with name "preset 1" lens: # lens and picture control {"type":n,"value":v} type: 0="aperture" 1="focus" 2="magnify" value: 0.01..1 patrol: {"status":"ok","data":[{"id":0,"presetid": 1,"name":"1111","staytime":10},{"id":1,"presetid": 2,"name":"2222","staytime":10}]} type: 0="list" 1="Save Patrol" 2="Delete Patrol" 3="Start Patrol" 4="Stop Patrol"
      
      







  left right up down stop preset locatePreset aux # param=auxnum/-auxnum turn aux on/off dropon dropoff sensor zoom # Not working
      
      





ptzおよびmptzコマンドは、ファームウェアの選択を開始する主な理由でした。







 http://<camip>/cgi-bin/jvsweb.cgi?cmd=ptz&action=move&param=["chnid":1,"x":0,"y":-0.5] http://<camip>/cgi-bin/jvsweb.cgi?cmd=mptz&action=down
      
      





両方のチームはカメラに断るよう指示します。 最初のケースでは、カメラが低下する速度を示します。 速度は、速度値の255倍として計算されます。 したがって、0.01の速度値では、カメラはティックごとに2ポイントの速度で下降します。 2番目の場合、カメラはティックごとに100ポイントの速度で低下します。 ティック値はまだわかりません。 測定する必要があります。







カメラは、ゼロ点に達するか、次のコマンドを受信するまで下がります。







 http://<camip>/cgi-bin/jvsweb.cgi?cmd=ptz&action=move&param=["chnid":1,"x":0,"y":0] http://<camip>/cgi-bin/jvsweb.cgi?cmd=mptz&action=stop
      
      





presetおよびLocatePresetは、位置決めポイントをすばやく追加して呼び出すために使用されます







 http://<camip>/cgi-bin/jvsweb.cgi?cmd=mptz&action=preset 1 http://<camip>/cgi-bin/jvsweb.cgi?cmd=mptz&action=locatePreset 1
      
      







ビデオストリームエンコーダー制御







  stream CMD CHANNELID stream set CHANNELID TYPE VALUE CMD: start start the stream stop stop the stream flush flush the stream restart restart the stream set set param debug if be 1, print the received stream package TYPE: width - resolution width height - resolution height framerate - framerate such as 30,25,20,15,10... nGOP - I frame between bitrate - bitrate with unit of Kbit Per Second
      
      







画像管理







  imageget: {"chnid":1,"type":0} type: 0 contrast 1 brightness 2 saturation 3 sharpness imageset: {"chnid":1,"type":0} type: 0 contrast 1 brightness 2 saturation 3 sharpness
      
      





パラメーターの変更を開始する前に、各設定のimagegetを作成し、変更を加えてimagesetを作成することをお勧めします









サウンドコントロール







  list set: { "sampleRate": 8000, "bitWidth": 1, "encType": 0, "level": 2, "muted": 1, "micGain": 69 }
      
      







音の定義







  list set: { "bEnable": 1, "bEnableRecord": 1, "nStart": 0, "bOutClient": 1, "bOutEMail": 1, "bOutVMS": 1, "bBuzzing": 1, "ADThreshold": 80, "ADTimeInterval": 60, "ADPercentage": 30 }
      
      







LED制御







  list set: 0 - turn off 1 - turn on
      
      





原則として、これはカメラとの相互作用を提供するほとんどすべてのコマンドセットです。 残りのコマンドは意味がありません。 これらは、デバッグ情報の出力をコンソールに提供します。







この記事を読んだ後、私たちの安全を確保するように設計されたデバイスは、より高いレベルのセキュリティを持つべきだと感じたと思います。 この記事は、これらのメーカーのデバイスをクラックすることを促すものではなく、多くのことが一見したものとは異なる場合があることを示しています。







新しいカメラの新しいファームウェアでは、onvifモジュールが完全に書き直されましたが、主な問題は同じ状態にあります。







次に並んでいるのは私のTENVIS JPT3815Wカメラです。それが何であるかを見てみましょう。 この記事を読んでくれてありがとう。







PS:Jovisionファームウェアの復号化に関する情報が必要な場合は、投稿できます。







©Aborche 2016

アボルシュ








All Articles