給任意java程序掛Socks5代理方法
Part1 前言
在內網橫向過程中,經常會用frp、狗洞、nps等工具,在內網環境中搭建一個反向socks5代理,方便紅隊人員開展內網滲透工作。于是,紅對人員需要對各種滲透工具掛上Socks5代理,使用proxifier這個工具掛全局s5代理是非常方便的,但是有的滲透工具是使用java寫的,而且作者并沒有編寫Socks5代理功能,用proxifier掛java.exe進程的時候總會出現各種各樣的問題,這種情況下可以用java自帶的命令行功能解決。
本文章的各種命令都經過ABC_123的嚴格測試,同時仔細閱讀了官方的Oracle的手冊,也糾正一下網上各種文章的錯誤。
技術研究過程
- 命令行掛Socks5代理
啟動Socks5代理命令如下:
java -DsocksProxyHost=127.0.0.1 -DsocksProxyPort=1080 -jar webscan.jar
其中socksProxyHost是Socks5代理的IP地址,socksProxyPort是Socks5代理的端口號。socksProxyVersion版本號是5或者是4,默認是5版本,也就是Socks5代理,這里也可以指定。
如果socks5代理需要用戶名及密碼時,網上的文章介紹的方法是:
java -DsocksProxyHost=10.1.1.2 -DsocksProxyPort=8877 -Djava.net.socks.username=alibaba -Djava.net.socks.password=secret(此方法親測無效,目前我也沒找到命令行下設置S5代理用戶名及密碼的方法)
其中,java.net.socks.username是Socks5代理認證的用戶名,java.net.socks.password是Socks5代理認證的密碼。但是我java命令行接上述兩個參數,怎么都弄不成功,總是提示Socks認證失敗,如下圖所示:

- 命令行掛HTTP代理
如果想對一個Java程序設置HTTP代理,或者想用burpsuite對一個java程序進行抓包,那就按如下所示設置:
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
這里重點糾正一下網上各種文章的錯誤:
如果想使用代理訪問HTTP的URL,則必須使用http.proxyHost,http.proxyPort。如果想用代理訪問HTTPS的URL,則必須使用https.proxyHost,https.proxyPort。如果想同時抓HTTP、HTTPS的url訪問的話,以上4項是必須設置的,缺一不可!
具體命令解釋如下:
http.proxyHost是HTTP代理的IP地址,http.proxyPort是HTTP代理的端口,https.proxyHost是HTTPS代理的IP地址,https.proxyPort是HTTPS代理的端口
http.nonProxyHosts(經過我測試,此選項對于http/https型URL均適用),用于指定哪些IP地址可以直連網絡,不走HTTP/HTTPS代理,*是IP地址的通配符,按照|分割每個IP段,前后加上雙引號包裹起來。
如果HTTP代理需要用戶名密碼的話,則按照如下設置(以下命令摘抄自網絡,本地沒有帶用戶名密碼的http代理環境,所以沒測試):
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
http.proxyUser是HTTP代理的用戶名,http.proxyPassword是HTTP代理的密碼,如果沒有設置用戶名密碼認證,就不用設置這兩項。
HTTPS代理設置如下:
java -Dhttps.proxyHost=host -Dhttps.proxyPort=port -Dhttps.proxyUser=user -Dhttps.proxyPassword="password" -Djavax.net.ssl.trustStore=c:/cacerts -Djavax.net.ssl.trustStorePassword=changeit -jar webscan.jar
- 如果使用系統代理的話
java -Djava.net.useSystemProxies=true -jar webscan.jar
那么webscan.jar程序將會走IE瀏覽器設置的代理,也就是系統代理。然后打開IE瀏覽器,在“代理服務器”選項卡下設置一個代理IP即可:

- Java代碼編寫中設置代理
我在編寫各種Java工具時,一開始總是為寫HTTP代理、Socks5代理頭疼,因為太麻煩了。后續發現了一個簡單有效的方法,可以在代碼中直接添加System.setProperty設置,非常好用。
設置HTTP/HTTPS代理如下:

總結
1. 看官網手冊挺重要的,更多的java命令行的網絡設置方法,可以看Oracle官方的手冊
https://docs.oracle.com/javase/8/docs/technotes/guides/net/properties.html
https://docs.oracle.com/javase/10/docs/api/java/net/doc-files/net-properties.html
2. 這種方法對于一些特殊框架編寫的Java應用無效,這只是極少數的情況,我在具體滲透過程中,還沒有遇到。