为任意Java程序配置Socks5与HTTP代理的方法

在红队渗透测试的内网横向移动过程中,搭建反向代理是常见操作。frp、NPS等工具可快速构建Socks5代理,方便红队人员在内网环境中进行渗透。然而,许多渗透工具由Java编写,且部分工具未内置Socks5代理支持。使用Proxifier为java.exe进程设置全局Socks5代理时总会出现各种各样的问题。

本文将详细介绍如何通过Java命令行参数或代码方式为任意Java程序配置Socks5与HTTP代理,助力红队高效开展内网渗透。


1. 命令行配置Socks5代理

通过Java虚拟机(JVM)的系统属性,可以为Java程序快速配置Socks5代理。基本命令如下:

bash 复制代码
java -DsocksProxyHost=127.0.0.1 -DsocksProxyPort=1080 -jar webscan.jar
参数说明:
  • -DsocksProxyHost:Socks5代理的IP地址。
  • -DsocksProxyPort:Socks5代理的端口号。
  • -DsocksProxyVersion:代理协议版本,默认为5(即Socks5),可设置为4以使用Socks4。
关于Socks5代理认证:

网上常见文章提到通过以下参数设置Socks5代理的用户名和密码:

bash 复制代码
java -DsocksProxyHost=10.1.1.2 -DsocksProxyPort=8877 -Djava.net.socks.username=alibaba -Djava.net.socks.password=secret

注意 :经测试,-Djava.net.socks.username-Djava.net.socks.password 参数在实际环境中往往无效,运行时会提示Socks认证失败。目前,命令行方式暂未找到可靠的Socks5认证配置方法,建议优先使用无需认证的Socks5代理,或通过代码方式实现认证(见后文)。

2. 命令行配置HTTP/HTTPS代理

当需要为Java程序配置HTTP代理(例如通过Burp Suite抓包)时,可使用以下命令:

bash 复制代码
java -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=8080 -Dhttps.proxyHost=127.0.0.1 -Dhttps.proxyPort=8080 -Dhttp.nonProxyHosts="*.example.com|localhost" -jar webscan.jar
参数说明:
  • -Dhttp.proxyHost:HTTP代理的IP地址。
  • -Dhttp.proxyPort:HTTP代理的端口。
  • -Dhttps.proxyHost:HTTPS代理的IP地址。
  • -Dhttps.proxyPort:HTTPS代理的端口。
  • -Dhttp.nonProxyHosts:指定无需代理的地址,支持通配符(如 *.example.com),多个地址以 | 分隔,整体用双引号包裹。经测试,该参数同时适用于HTTP和HTTPS请求。
常见误区纠正:

许多文章错误认为仅设置 http.proxyHosthttp.proxyPort 即可同时代理HTTP和HTTPS请求。实际必须同时设置 http.proxyHosthttp.proxyPorthttps.proxyHosthttps.proxyPort 四项,否则HTTPS请求无法通过代理,导致抓包失败。

HTTP代理认证:

若HTTP代理需要认证,可尝试以下命令(未在本地验证,摘自网络):

bash 复制代码
java -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=8080 -Dhttp.proxyUser=username -Dhttp.proxyPassword=password -Dhttp.nonProxyHosts="*.example.com|localhost|10.*.*.*" -jar webscan.jar
  • -Dhttp.proxyUser:HTTP代理用户名。
  • -Dhttp.proxyPassword:HTTP代理密码。

若无需认证,可省略上述两项。

HTTPS代理认证:

对于需要认证的HTTPS代理,需额外配置SSL信任存储:

bash 复制代码
java -Dhttps.proxyHost=127.0.0.1 -Dhttps.proxyPort=8080 -Dhttps.proxyUser=username -Dhttps.proxyPassword=password -Djavax.net.ssl.trustStore=c:/cacerts -Djavax.net.ssl.trustStorePassword=changeit -jar webscan.jar
  • -Djavax.net.ssl.trustStore:指定信任存储文件路径。
  • -Djavax.net.ssl.trustStorePassword:信任存储密码,默认为 changeit

3. 使用系统代理

若希望Java程序直接使用系统代理(如IE浏览器配置的代理),可使用以下命令:

bash 复制代码
java -Djava.net.useSystemProxies=true -jar webscan.jar

运行后,程序将自动使用IE浏览器"代理服务器"选项卡中配置的代理地址。配置步骤为:

  1. 打开IE浏览器。
  2. 进入"Internet选项" → "连接" → "局域网设置"。
  3. 在"代理服务器"中输入代理IP和端口。

4. 在Java代码中设置代理

为解决命令行配置的局限性(如Socks5认证问题),可在Java代码中通过 System.setPropertyProxy 类动态设置代理。这种方式灵活且便于维护,尤其适合开发自定义渗透工具。

设置HTTP/HTTPS代理:
java 复制代码
System.setProperty("http.proxyHost", "127.0.0.1");
System.setProperty("http.proxyPort", "8080");
System.setProperty("https.proxyHost", "127.0.0.1");
System.setProperty("https.proxyPort", "8080");
System.setProperty("http.nonProxyHosts", "*.example.com|localhost");
设置Socks5代理:
java 复制代码
System.setProperty("socksProxyHost", "127.0.0.1");
System.setProperty("socksProxyPort", "1080");
Socks5代理认证实现:

为支持Socks5代理认证,可自定义 ProxyAuth 类,代码如下:

java 复制代码
import java.net.Authenticator;
import java.net.PasswordAuthentication;

public class ProxyAuth extends Authenticator {
    private final String user;
    private final String password;

    public ProxyAuth(String user, String password) {
        this.user = user;
        this.password = password;
    }

    @Override
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(user, password.toCharArray());
    }

    public static void setAuth(String user, String password) {
        Authenticator.setDefault(new ProxyAuth(user, password));
    }
}

使用示例:

java 复制代码
ProxyAuth.setAuth("alibaba", "secret");
System.setProperty("socksProxyHost", "127.0.0.1");
System.setProperty("socksProxyPort", "1080");

此方法通过代码实现Socks5认证,弥补了命令行配置的不足,适合需要动态调整代理的场景。