精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

使用匿名管道技術獲取CMD命令的執行結果

蛇矛實驗室 ? 來源:蛇矛實驗室 ? 2023-04-03 18:04 ? 次閱讀

序言

遠程 CMD 是指惡意程序接收到控制端發送的 CMD 指令后,在本地執行 CMD 命令,并將執行結果回傳至控制端。本文將演示使用匿名管道技術獲取 CMD 命令的執行結果。

相關API

CreatePipe:用于創建管道

PeekNamedPipe:用于判斷管道中是否有數據存在

ReadFile、WriteFile:用于向管道讀取或寫入數據

CreateProcess:用于創建CMD子進程,可指定啟動信息(STARTUPINFO)

實現原理

管道是一種進程間通信的技術,Window 上進程間通信技術還有文件映射、共享內存、郵槽、剪切板、事件等。

管道分為命名管道和匿名管道:

* 匿名管道只能在父子進程間通信,數據傳輸單向,不能網絡通信

* 命名管道可在任意進程間通信,數據傳輸雙向,但同一時間只能有一端讀寫。

由于遠程 CMD 中僅僅需要執行 CMD 指令的結果,所以使用匿名管道即可,其使用流程如下:

1. 使用 CreatePipe 創建匿名管道,獲取管道數據讀取句柄和管道數據寫入句柄。

2. 初始化進程結構體,將管道寫入句柄賦給新進程控制臺窗口的緩存句柄;

3. 使用CreateProcess創建新進程執行CMD命令,并等待命令執行結束;

4. 在循環中使用 PeekNamedPipe 函數判斷管道中是否有數據,通過管道讀取句柄從緩沖區中獲取執行結果。

5. 關閉句柄,釋放資源。

編碼實現

關鍵代碼

// 執行 cmd 命令, 并獲取執行結果數據
bool PipeCmd(TCHAR* cmd_str, std::string& outbuf)
{
BOOL bRet = FALSE;

HANDLE hReadPipe = NULL;
HANDLE hWritePipe = NULL;
SECURITY_ATTRIBUTES securityAttributes = {0};
STARTUPINFO si = {0};
PROCESS_INFORMATION pi = {0};

// 設定管道的安全屬性
securityAttributes.bInheritHandle = TRUE;
securityAttributes.nLength = sizeof(securityAttributes);
securityAttributes.lpSecurityDescriptor = NULL;
// 創建匿名管道
bRet = ::CreatePipe(&hReadPipe, &hWritePipe, &securityAttributes, 0);
if(FALSE== bRet)
{
printf("CreatePipe");
returnfalse;
}
// 設置新進程參數
si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
si.wShowWindow = SW_HIDE;
si.hStdError = hWritePipe;
si.hStdOutput = hWritePipe;
// 創建新進程執行命令, 將執行結果寫入匿名管道中
bRet = ::CreateProcess(NULL, cmd_str, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
if(FALSE== bRet)
{
printf("CreateProcess");
returnfalse;
}

// 等待命令執行結束
::WaitForSingleObject(pi.hThread, INFINITE);
::WaitForSingleObject(pi.hProcess, INFINITE);

// 不斷從匿名管道中讀取結果到輸出緩沖區
while(true)
{
char buf[2048]{};
DWORD readbytes = 0;
DWORD availbytes = 0;

if(!PeekNamedPipe(hReadPipe, NULL, 0, NULL, &availbytes, NULL)) break;
if(!availbytes) break;
if(!ReadFile(hReadPipe, buf, min(sizeof(buf) - 1, availbytes), &readbytes, NULL) || !readbytes) break;

buf[readbytes] = 0;
outbuf += buf;
}

// 關閉句柄, 釋放內存
::CloseHandle(pi.hThread);
::CloseHandle(pi.hProcess);
::CloseHandle(hWritePipe);
::CloseHandle(hReadPipe);

returntrue;
}

上面的代碼中首先調用 CreatePipe 函數創建匿名管道,并將返回的讀寫句柄保存到 hReadPipe 和 hWritePipe 變量中。

然后,通過設置STARTUPINFO結構體中的參數,將新進程的標準錯誤輸出和標準輸出都重定向到管道中,以便將命令執行結果寫入管道中。

接著,調用CreateProcess函數創建新進程,并將命令行命令作為參數傳入。

CreateProcess 函數執行成功后,新進程開始執行命令,并將命令執行結果寫入管道中,之后通過循環調用 PeekNamedPipe 和 ReadFile 函數,不斷從管道中讀取數據,并將讀取到的數據存儲到輸出緩沖區中。

最后,代碼關閉句柄,釋放內存。

測試實現

測試代碼

intmain(intargc, char** argv)
{
TCHAR cmd_str[] = L"ping 127.0.0.1";

// 執行 cmd 命令, 并獲取執行結果數據
std::stringoutbuf;
if(false== PipeCmd(cmd_str, outbuf))
{
printf("pipe cmd error.
");
}
else
{
printf("CMD執行結果為:
%s
", outbuf.c_str());
}

system("pause");
return0;
}

b4ead242-d004-11ed-bfe3-dac502259ad0.png

遠程傳輸

前面僅僅是把 cmd 命令的執行結果獲取了,要想實現遠程傳輸,需要加入網絡傳輸部分。

b4fd46e8-d004-11ed-bfe3-dac502259ad0.png

測試

服務端

#definePORT 9982
inttest_server()
{
SOCKET listenfd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

sockaddr_in bindaddr;
bindaddr.sin_family = AF_INET;
bindaddr.sin_addr.S_un.S_addr = ADDR_ANY;
bindaddr.sin_port = htons(PORT);
bind(listenfd, (SOCKADDR*)&bindaddr, sizeof(SOCKADDR));

listen(listenfd, 1);

sockaddr_in clientaddr;
intclientaddrlen = sizeof(SOCKADDR);
SOCKET clientfd = accept(listenfd, (SOCKADDR*)&clientaddr, &clientaddrlen);

charbuf[1024]{};
intrecvbytes = recv(clientfd, buf, 1024, 0);
if(recvbytes <= 0) return?-1;

???std::string?outbuf;
???PipeCmd((LPTSTR)buf, outbuf);
???std::cout?<< outbuf << std::endl;

???closesocket(clientfd);
???closesocket(listenfd);

???return?0;
}

客戶端

inttest_client()
{
SOCKET connfd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

structsockaddr_inServerAddr;
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
ServerAddr.sin_port = htons(PORT);

connect(connfd, (SOCKADDR*)&ServerAddr, sizeof(ServerAddr));

TCHAR cmdbuf[100] = _T("ipconfig");
send(connfd, (char*)cmdbuf, (lstrlen(cmdbuf) + 1) * sizeof(TCHAR), 0);

closesocket(connfd);

return0;

效果

開啟服務器后,通過客戶端向服務端發送指令,服務端接收到指令后開始處理,最終測試能夠正確處理。

小結

上述的遠程 CMD 的實現通過一個匿名管道實現的,它是通過直接執行 cmd 命令,從而不需要創建傳遞命令的管道。遠程 CMD 的實現方法還有幾種變形方式,比如雙管道遠程 CMD,和零管道遠程 CMD,它們對應的思路就是對 CMD 的輸出輸入重定向位置進行控制,比如:

雙管道實現遠程 CMD 就是將 CMD 進程的輸入、輸出句柄替換為讀寫管道的句柄。

零管道實現遠程 CMD 就是將 CMD 進程的輸入、輸出句柄替換為 socket 的句柄。






審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • WINDOWS
    +關注

    關注

    3

    文章

    3524

    瀏覽量

    88426
  • CMD命令
    +關注

    關注

    0

    文章

    28

    瀏覽量

    8299

原文標題:安全研發之遠程CMD

文章出處:【微信號:蛇矛實驗室,微信公眾號:蛇矛實驗室】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    CMD262_Data_Sheet-1815818

    和穩定性。CMD262的設計旨在滿足現代電子產品對高效能和低功耗的需求,廣泛應用于智能手機、平板電腦、可穿戴設備等領域。產品技術資料CMD262的主要技術規格包括:輸
    發表于 10-22 17:31 ?0次下載

    CMD242K4_Data_Sheet-1950730

    CMD242K4產品概述與應用產品概述CMD242K4是一款高性能的功率放大器,專為寬帶無線通信和射頻應用設計。該器件采用先進的GaAs(砷化鎵)技術,能夠在廣泛的頻率范圍內提供卓越的增益和線性度
    發表于 10-22 09:28 ?0次下載

    瀚海微SD NAND存儲功能描述(11)命令系統CMD8

    25 MB/sec的接口速度,時鐘速率增加到50 MHz, CLK/CMD/DAT信號時序和電路條件被重新考慮并從物理層規范1.01版本更改。 上電后,SD卡處于默認的速度模式,使用開關功能命令
    的頭像 發表于 08-12 16:03 ?344次閱讀
    瀚海微SD NAND存儲功能描述(11)<b class='flag-5'>命令</b>系統<b class='flag-5'>CMD</b>8

    瀚海微SD NAND存儲功能描述(10)CMD6和其他命令關系

    CMD6 DATA與其他命令的關系 在CMD6事務期間,卡可以僅使用CMD(CMD12, CMD
    的頭像 發表于 08-11 16:32 ?309次閱讀
    瀚海微SD NAND存儲功能描述(10)<b class='flag-5'>CMD</b>6和其他<b class='flag-5'>命令</b>關系

    瀚海微SD NAND存儲功能描述(8)專用命令CMD55 56

    應用專用命令app_cmd (CMD55) 當卡接收到這個命令時,會使卡將下面的命令解釋為一個特定于應用程序的
    的頭像 發表于 08-08 10:39 ?1086次閱讀
    瀚海微SD NAND存儲功能描述(8)專用<b class='flag-5'>命令</b><b class='flag-5'>CMD</b>55  56

    瀚海微SD NAND應用存儲功能描述(4)電壓切換命令

    電壓開關命令CMD11電壓開關命令定義如下圖所示。 CMD11可以在就緒狀態下執行,不改變狀態。即使卡被鎖定,也可以
    的頭像 發表于 08-02 10:03 ?343次閱讀
    瀚海微SD NAND應用存儲功能描述(4)電壓切換<b class='flag-5'>命令</b>

    是否可以使用AT命令獲取ADC值?

    是否可以使用AT命令獲取ADC值? 如果是,要使用哪個命令
    發表于 07-16 07:06

    管道風速傳感器的安裝在管道的前端還是后端

    管道風速傳感器是一種用于測量管道內氣流速度的儀器,廣泛應用于工業、農業、環保、氣象等領域。在安裝管道風速傳感器時,需要考慮多種因素,以確保測量結果的準確性和可靠性。本文將詳細介紹
    的頭像 發表于 07-01 09:14 ?734次閱讀

    關于SDIO命令寄存器(SDIO_CMD)的疑問求解?

    請教下SDIO命令寄存器(SDIO_CMD)第12位ENCMDcompl:使能CMD完成(Enable CMD completion)如果設置該位,則使能
    發表于 05-16 06:57

    在卡初始化的過程中,CMD8之后發送一個cmd55命令做什么?

    在卡初始化的過程中,CMD8之后發送一個cmd55命令做什么?在ACMD41前發送的那個我明白,但是在CMD55在CMD8后用作檢測的說明也
    發表于 05-14 08:23

    HarmonyOS開發:【基于命令行(獲取源碼)】

    在Ubuntu環境下通過以下步驟獲取OpenHarmony源碼。
    的頭像 發表于 04-25 22:08 ?370次閱讀
    HarmonyOS開發:【基于<b class='flag-5'>命令</b>行(<b class='flag-5'>獲取</b>源碼)】

    cmd_tbl_t結構體變量調用命令信息

    一個cmd_tbl_t結構體變量包含了調用一條命令的所需要的信息。 ? 對于環境變量bootcmd,執行run_command(bootcmd, flag)之后,最終是將bootcmd中的參數解析為
    的頭像 發表于 12-04 17:37 ?582次閱讀
    <b class='flag-5'>cmd</b>_tbl_t結構體變量調用<b class='flag-5'>命令</b>信息

    bootm命令執行流程

    Bootm命令用來從memory啟動內核,bootm命令執行流程如下圖所示。 在串口終端輸入bootm命令后,執行do_bootm函數來完
    的頭像 發表于 12-04 17:33 ?1102次閱讀
    bootm<b class='flag-5'>命令</b>的<b class='flag-5'>執行</b>流程

    uboot命令執行過程是什么

    U-boot是通過執行u-boot提供的命令來加載Linux內核的,其中 命令bootm的功能 即為從memory啟動Linux內核映像文件。 在講解bootm加載內核之前,先來看看u-boot中
    的頭像 發表于 12-04 17:31 ?763次閱讀

    Linux內核中Uboot命令處理

    ; /* 命令名稱 */ int maxargs; /* 命令的最大參數 */ int repeatable; /* 是否可重復(按回車鍵是否會重復執行) */ int (*cmd)(
    的頭像 發表于 12-04 17:23 ?458次閱讀