译者:牧野之鹰
预估稿费:170RMB
投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿
相信每一个渗透测试人员都明白那种美妙的感觉——netcat接收到反弹回来的反向shell,一行行让人满足的的详细的netcat信息被打印出来。
如果其他的渗透测试人员也像我一样,他们肯定也知道那种可怕的感觉——当他们的shell因为他们运行了一个错误的命令而被挂起时,本以为敲击“Ctrl-C”会搞定这个状况,但是没想到却断开了整个连接。
除了不正确的处理技术,这些“愚蠢”的shell还有其他的缺点:
1.一些命令,比如“su”和“ssh”需要适当的终端才能运行
2.标准错误信息(STDERR)经常不会被显示出来
3.不能正确使用文本编辑器如VIM
4.没有命令补全功能
5.“上”按键没有历史纪录功能
6.没有任务管理功能
7.等等。。。
长话短说,虽然这些shell相对来说很容易实施和捕获,但我更希望在一个完全互动的终端(TTY)中进行操作。
我发现了一些很好的资源,其中包括一些非常有用的技术和技巧,可以用来“升级”这些shell,希望在一篇文章中展示和分享。 在Pentest Monkey网站上, 根据Phineas Fisher发布的视频和他非法活动的writeups,我学会了这些技巧。
1.Pentest Monkey – Post Exploitation Without a TTY
2.Phineas Fisher Hacks Catalan Police Union Website
3.Phineas Fisher – Hackingteam Writeup
先简单说一下思路,在后面的截图和命令中,我会向一个有漏洞的Web服务器(受害者)注入命令,然后在我的kali虚拟机上接收反弹回来的shell。
1.受害者 IP: 10.0.3.7
2.我的KALI IP: 10.0.3.4
Generating reverse shell commands
相信每一个人都十分熟悉利用netcat获取反向shell的传统方法:
接收:
但问题是并不是每一个服务器会安装netcat,而且也并不是每一个版本的netcat有“-e”参数。
Pentest Monkey上有一个很大的备忘单,列出了好些不同的方法,但是我最喜欢用的方法是利用Metasploit的msfvenom来为我生成一套命令。
在Metasploit 的"cmd/unix"目录下,有一些payload可以用来生成一套bind shell或者是反向shell。
这些payload中的任何一个都可以配合msfvenom使用生成我们所需要的原始命令(需要指定LHOST, LPORT or RPORT)。比如,以下是一个netcat命令,其并不需要“-e”参数:
还有一个Perl oneliner可以处理netcat没有被安装的情况:
这些都可以通过使用netcat和监听端口(4444)来捕获。
Method 1: Python pty 模块
在捕获了一个“愚蠢”的shell之后很长一段时间内,我使用的核心命令是用Python来加载pty模块。Pty模块可以为你生成一个伪终端,这可以欺骗一些命令如“su”,让他们以为他们是在合适的终端中执行的。要想升级“愚蠢”的shell,让他们具有如上的功能,只需简单的运行如下命令:
然后你就可照常运行“su”等命令,如下
不幸的是,该方法并不能解决上面提到的其他一些问题。组合键(Ctrl-C)仍将关闭netcat,也没有命令不全功能或历史记录功能。但这个快速但不完美的解决方法,帮助了我无数次。
Method 2: 使用 socat
Socat就像netcat一样是一个非常强大的网络瑞士军刀。通过TCP连接,我们可以用socat建立完整的TTY。如果在受害者服务器上安装了socat,你就可以用它来反弹一个反向shell。而你必须捕获与socat的连接,以便获得全部的功能。
下面的命令会生成一个完全交互的TTY反向shell:
On Kali (listen):
On Victim (launch):
如果socat没有被安装,也不要叹气,这里还有一些独立的二进制文件,你可以到下面的GitHub链接中下载:
https://github.com/andrew-d/static-binaries
利用一个命令注入漏洞,就可以用一行命令在受害者服务器下载一个正确架构的socat到可写目录,然后改变它的权限(chmod),最后执行并反弹回一个反向shell:
而在kali上,你会捕获到一个完整交互的TTY会话,它支持命令补全功能,支持SIGINT/SIGSTP,vim,“上”键的历史纪录功能,等等。这是一个完整的终端,非常好。
Method 3: 魔法般的升级netcat
我在Phineas Fisher的黑客视频中看到他使用了这种技术,感觉就像是魔法一般。简单的说,只要设置一下kali终端内的一些stty参数,就可以将一个“愚蠢”的netcat shell升级为一个完整的TTY。
首先,遵循与方法1相同的技术,用Python加载PTY模块,一旦bash在PTY中运行了,用组合键“Ctrl-Z”将shell放到后台中去。
当shell进到后台之后,现在来检查当前的终端和STTY信息,如此一来我们就可以强制已经连接上的shell去匹配它:
我们需要的信息是TERM类型("xterm-256color")和当前TTY的窗口大小("rows 38; columns 116")。
让shell继续保持在后台运行,现在将当前的STTY设置为原始类型,并告诉它回显输入字符,命令如下:
由于使用了原始类型的STTY,所以这些输入/输出看上去都怪怪的,而且你也不会看到下一条命令,但是当您键入它们时,它们就会被处理。
接下来用“fg”将shell提到前台来,它会重新打开反向shell,但是内容的格式将会被去除掉。最后,用“reset”重置终端。
注意:我并没有再次手动输入“nc”命令(上图中看起来像是我手动输入的)。我输入的是“fg”,只是它没有回显。现在“nc”命令是在前台的任务了。然后将“reset”命令输入到netcat shell中。
在用“reset”进行了重置后,shell看起来应该恢复了正常。最后一步是设置shell,终端类型,以及STTY的大小,使其匹配我们当前的kali窗口(信息来自上面收集的)。
最终的结果是得到一个完全交互的TTY,它包含了我们所期望的所有特性(命令补全功能、历史记录功能、任务控制等),所有这些都是在一个netcat连接上:
现在的可能性是无穷的。可以用Tmux来处理一个netcat shell吗 ? ?为什么不可以呢?:D
命令备忘录:
用Python创建假终端
使用socat
使用STTY选项