在红队渗透测试的内网横向移动过程中,搭建反向代理是常见操作。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.proxyHost
和 http.proxyPort
即可同时代理HTTP和HTTPS请求。实际必须同时设置 http.proxyHost
、http.proxyPort
、https.proxyHost
和 https.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浏览器"代理服务器"选项卡中配置的代理地址。配置步骤为:
- 打开IE浏览器。
- 进入"Internet选项" → "连接" → "局域网设置"。
- 在"代理服务器"中输入代理IP和端口。
4. 在Java代码中设置代理
为解决命令行配置的局限性(如Socks5认证问题),可在Java代码中通过 System.setProperty
或 Proxy
类动态设置代理。这种方式灵活且便于维护,尤其适合开发自定义渗透工具。
设置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认证,弥补了命令行配置的不足,适合需要动态调整代理的场景。